本帖最后由 胡永城 于 2014-3-27 13:29 编辑
在C语言中,字符串表现为带有'\0'字符的字符数组;
有两种表现方式:数组与指针,两种表现方式本质相同,都是找到首字符的地址,向后遍历到'\0'表示的字符串末尾。
如以下:
char s1[] = {'i', 't', 'c', 'a', 's', 't', '\0'}; //表示字符串
char s1[] = {'i', 't', 'c', 'a', 's', 't}; //仅仅表示字符数组
回到正题:
"itcast" 表示的是字符串常量,而不是只读变量(const)。
存储在全局常量区中,只保留一份实体。
就是说,一个程序中所有出现的"itcast",都是同一个!
printf("%p\n", "itcast");
所有以上语句打印结果一样!
在程序中,字符串常量代表的是其在全局常量区中得地址;
就是说"itcast",表示其在全局区中得地址。
char a[] = "itcast";//#1
char *b = "itcast"//#2
#1:拷贝构造,把"itcast"中得所有字符拷贝到a数组中:char a[] = {'i', 't', 'c', 'a', 's', 't', '\0'}
#2:赋值,把"itcast"表示的地址赋值给b指针。
于是,就有了数组a可以更改单个字符,而指针b不可以更改了。
a[1] = 'h'; // ok
*(a+2) = 'e'; // ok
b[1] = 'h'; // error
*(b+2) = 'e'; //error
因为a是在栈上的变量。
b指向常量区的字符串常量!
|