字符数组与字符串指针
字符数组:
数组名是一个指针常量,不能直接赋值,即 char str[10]; str = "abcd";
不能出现对数组名的自加或者自减,即str++, str--;
1 //字符数组(C风格字符串) 2 int main(){ 3 char str1[] = "abc"; 4 char str2[] = {'a', 'b', 'c'};//不以空字符结束,产生未定义行为 5 char str3[] = {"abc"}; 6 char str4[] = {'a', 'b', 'c', '\0'}; 7 printf("str1: %s\n", str1); 8 printf("str2: %s\n", str2); 9 printf("str3: %s\n", str3); 10 printf("str4: %s\n", str4); 11 return 0; 12 }
上述printf后的结果,除了第二个str2可能超出abc的长度,其他三个都是等价的,结果为abc。
当使用数组时真正用的是指向数组首元素的地址。str1[2] = (str1 + 2)所指向的元素。
字符串指针:
指向常量数据区,不能更改指向常量的内容,即不能有*p=XXXXX;
可以改变字符指针变量的值,即p本身,p=XXX。
1 int main(){ 2 char *p1 = "abc"; 3 char *p2 = p1 + 1; 4 printf("p1: %s\n", p1); 5 printf("p2: %s\n", p2); 6 return 0; 7 }
p1是常量字符串abc的首地址,输出结果是abc。p2是“abc”第二个字符的地址,输出结果是bc。
1 int main(){ 2 const char str1[] = "abc"; 3 const char str2[] = "abc"; 4 const char *p1 = "abc"; 5 const char *p2 = "abc"; 6 7 printf("%d %d %d %d", str1, str2, p1, p2); 8 return 0; 9 } 10 //结果是str1和str2地址不一样 11 //p1和p2地址相同
str1和str2是两个字符数组的首地址;p1和p2是字符串常量的地址,而该字符串常量是一样的,所以p1和p2的值都是字符串常量abc的值。
查看了str1和str2的值,二者相差了4,而且是str1>str2,这也证明了C++中栈的生长方向是向下的,向着内存地址减小的方向增长。
详细的关于C/C++堆、栈等数据区内容。