"Programming"和"Programming"是同一个"Programming"吗?
什么意思?
C语言没有专门的字符串类型,但是,它同样可以处理字符串。本文不是讨论字符串的使用,而是讨论C字符串之间的关系。如题,在C语言代码中,如果定义#define STR = "Programming",然后再用printf("%s","Programming");试问,这两个"Programming"有什么共同之处?初学者可能就认为这只是内容一样。其实,这么说来也没错,但是它们还有别的“不可告人的秘密”,到底是什么呢?
让我们来实践一下!
首先我们先来看看代码:
#include <stdio.h> #define STR "Programming" int main(void)
{
printf("STR %s (%p\n",STR,&STR);
printf("!!! %s (%p\n","Programming","Programming");
getch();
return ;
}
%p代表输出指针的内容(地址),如果编译器不支持%p,请换成%u,%lu或%#x。
这段代码在TDM-GCC 4.8.1 编译后运行:

在Visual C++ 2010编译后:

从这个示例我们得到什么?
示例中我们可以看出,两个字符串的地址竟然相同!!!我的看法是:编译器这样做是为了节约内存空间。C Primer Plus对这的看法是:“编译器可以把多次使用的相同字面量(常量)储存在一处或多处”。可以肯定的是,现在大多数的编译器都支持把它们存储在一处。上面的代码在另一台计算机中用TC编译之后,结果也是地址相同。可能很早以前就有这种功能了,因为当时的内存容量很小。
这样就说明一个问题:如果在操作字符串常量时使用指针,那么用指针更改字符串时就会导致其他相同的字符串也改变,因为指针只保存地址,不拷贝内容,操作的是静态存储区的字符串。所以,C Primer Plus建议大家使用数组对字符串进行处理,因为数组使用动态存储空间,它拷贝了原来在静态存储区的字符串。如果一定要用指针对字符串常量进行处理,推荐这样声名:
const char * pch
防止更改不应该更改的内容。
"Programming"和"Programming"是同一个"Programming"吗?的更多相关文章
- Programming Series 1.0 — C Programming
In the growing world of technology, C programming has kind of lost its way. Today, we have a million ...
- 【离散化树状数组】Nordic Collegiate Programming Contest G.Galactic Collegiate Programming Contest
#include<bits/stdc++.h> using namespace std; typedef long long ll; int n,m; ; struct node { in ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
- Language Oriented Programming:下一代编程样式 Part I (翻译)
原文信息 原文地址 作者信息 Sergey Dmitriev JetBrains Sergey Dmitriev is the cofounder and CEO of JetBrains Inc., ...
- Teach Yourself Programming in Ten Years
Teach Yourself Programming in Ten Years——用十年教会自己编程 作者:Peter Norvig 译者:刘海粟 本文原文为:http://norvig.com/21 ...
- [iOS翻译]《iOS 7 Programming Pushing the Limits》系列:你可能不知道的Objective-C技巧
简介: 如果你阅读这本书,你可能已经牢牢掌握iOS开发的基础,但这里有一些小特点和实践是许多开发者并不熟悉的,甚至有数年经验的开发者也是.在这一章里,你会学到一些很重要的开发技巧,但这仍远远不够,你还 ...
- Questions that are independent of programming language. These questions are typically more abstract than other categories.
Questions that are independent of programming language. These questions are typically more abstract ...
- Coursera课程 Programming Languages 总结
课程 Programming Languages, Part A Programming Languages, Part B Programming Languages, Part C CSE341: ...
- Reactive Programming
Reactive的表现 Reactive 规范是 JVM Reactive 扩展规范 Reactive Streams JVM,而 Reactive 实现框架则是最典型的实现: Reactive St ...
随机推荐
- C++历史(The History of C++)
C++历史 早期C++ •1979: 首次实现引入类的C(C with Classes first implemented) 1.新特性:类.成员函数.继承类.独立编译.公共和私有访问控制.友元.函数 ...
- SDUT 3345 数据结构实验之二叉树六:哈夫曼编码
数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 字符的编 ...
- 【练习】如何显示本地主机上的MySQL客户机版本
在终端窗口以oracle用户身份登录 [root@enmo ~]# su - oracle [oracle@enmo ~]$ mysql -V mysql Ver , for Linux (x86_6 ...
- JS获取当前文件所在的文件夹全路径
var js = document.scripts; js = js[js.length - 1].src.substring(0, js[js.length - 1].src.lastIndexOf ...
- 学习总结 html图片热点,网页划区,拼接,表单
表单: action="负责处理的 <form id="" name="" method="post/get"服务端&quo ...
- CHARINDEX用法
CHARINDEX返回字符串中指定表达式的起始位置. 语法CHARINDEX ( expression1 , expression2 [ , start_location ] ) 参数expre ...
- JavaScript设计模式
-->面向对象中的23种设计模式简介 最近看了一本书,推荐给大家<JavaScript设计模式与开发实践>图灵出版社的,讲的非常棒! 详细讲解了js开发中常用的14种设计模式,有很多 ...
- WWF3事务和异常处理类型活动<第四篇>
一.FaultHandler 添加一个工作流图如下: 首先添加一个Seruence,在里面添加3个Code,外面添加一个Code,打开Seruence错误处理,在容器里添加一个faultHandler ...
- docker1.12在cento7里的跨多主机容器网络
docker1.12在cento7里的跨多主机容器网络
- 【MySQL】MySQL索引背后的之使用策略及优化【转】
转自:http://database.ctocio.com.cn/353/11664853.shtml 另外很不错的对于索引及索引优化的文章: http://www.cnblogs.com/magia ...