字符数组与字符串指针

字符数组:

数组名是一个指针常量,不能直接赋值,即 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', ''};
 7     printf("str1: %s
", str1);
 8     printf("str2: %s
", str2);
 9     printf("str3: %s
", str3);
10     printf("str4: %s
", 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
", p1);
5     printf("p2: %s
", 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()的用法

原文地址:https://www.cnblogs.com/cnblogsnearby/p/4683435.html