字符数组与字符串指针

字符数组:

数组名是一个指针常量,不能直接赋值,即 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++堆、栈等数据区内容。

※※※※关于strlen, sizeof()的用法

posted @ 2015-07-28 17:01  LizSep  阅读(252)  评论(0编辑  收藏  举报