关于字符串常量
软件版本:
操作系统:ubuntu10.04
内核版本:Linux version 2.6.32-36-generic
编译器:gcc version 4.4.3
目录:
1. 什么是字符串常量
2. 与字符常量的区别
3. 初始化变量
3.1 初始化数组
3.2 初始化指针
4. 参考资料
1. 什么是字符串常量
字符串常量其实就是由一对双括号括起来的字符序列。例如:
"Hello Word!"
"A"
没错,"A" 也是字符串常量。
2. 与字符常量的区别
字符常量是指用单引号括起来的一个字符。例如:
'A'
区别:
·字符串常量占用多个字节,而字符常量只占用一个字节。'A' 与 "A" 的区别就在于前者只占用一个字节,用来存放字符 A 的 ASCII 码值;后者除了存放了 A 的 ASCII 码值以外,还有字符串结束符 '\0' ,所以他其实是占有两个字节。
·字符常量可以执行加减法运算,字符串常量则不支持。例如:'A' + 1 是合法的,但是 "A" + 1 就是非法的。
3. 初始化变量
可以使用字符串常量初始化的变量包括数组和指针。
3.1 初始化数组
使用字符串常量初始化数组:
char a[] = "string";
字符串常量指明数组中字符的初始值以及数组长度。由字符串变量初始化的数组是可以修改的。
3.2 初始化指针
使用字符串常量初始化指针:
char *p = "string";
字符串常量存放在一个无名只读静态数组中,指针 p 指向该无名数组。初始化指针时所创建的字符串常量被定义为只读。换言之,如果想修改指针 p 的内容是非法的,但是修改指针的值是合法的。
我很好奇这个字符串常量到底是存放在哪里,所以我要编一个程序观察一下。
#include<stdio.h>
int main(void)
{
char *p = "string";
printf("p = %s.\n", p);
return 0;
}
编译好之后,观察一下该二进制文档的所有段的内容(命令为:objdump -s main)。其中在 .rodata 段可以找到 “string” 的身影。
Contents of section .rodata:
80484d8 03000000 01000200 73747269 6e670070 ........string.p
80484e8 203d2025 732e0a00 = %s...
.rodata 段存放的是只读数据,一般是程序里面的只读变量和字符串常量。
4. 参考资料
[1] 《程序员的自我修养--链接、装载与库》
[2] http://jpk.sdju.edu.cn/cplus/kejian/CONTENT/chapter2/chapter2_2_4.htm