关于字符串常量

 

软件版本:
  操作系统: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 段存放的是只读数据,一般是程序里面的只读变量和字符串常量。