C语言-字符数组和字符常量指针的区别(+扩展:单字节字符数组 char arr[1])
1. 字符数组和字符常量指针
char a[] = "123";//1 字符数组
char b[] = "123";
char *p = "123"; //2 字符指针
char *q = "123";
1.1 看地址
printf("a===%p\n", a); //a===0xbfdda024 //%p表示输出a的地址
printf("b===%p\n", b); //a===0xbfdda018 //不一样
printf("p===%p\n", p); //p===0x8048839 //一样
printf("q===%p\n", q); //q===0x8048839 //一样
结果: 相同的值, 字符数组地址不一样;字符指针一样
1.2 看修改
a[0] = '4' // 可以
p[0] = '4' // 错误,编译器不能发现该错误,运行时错误
结果: 字符数组的值可以改变,字符指针的值不可改变
2.总结:
综上所述:
- 初始化的字符串数组存储在栈中,可以改变其值。
- 初始化的字符串常量指针存储在静态常量区,不能修改其值。
3. 扩展
- 字符数组和字符串的最明显的区别就是:字符串会被默认的加上‘\0’结束符;
- 字符数组并不要求最后一个字符为’\0’,是否需要加入,完全由系统决定;
- 在strcpy() 函数的时候,第二个参数应该是一个字符串常量,因为函数依靠结束符来判定的;
4. 扩展问题:
4.1 代码例子
#include <stdio.h>
#include <string.h>
int main()
{
int a = 100;
printf("Hello world %d\n",a);
char arr0[1];
memset(arr0,0,sizeof(arr0));
strcpy(arr0,"123456");
printf("Hello world arr0=%s\n",arr0);
char arr[1];
memset(arr,0,sizeof(arr));
strcpy(arr,"abcdeeee");
printf("Hello world arr=%s\n",arr);
char arr2[1]="2";
printf("Hello world arr2=%s\n",arr2);
char arr3[1]="3";
printf("Hello world arr3=%s\n",arr3);
char arr4[]="4";
printf("Hello world arr4=%s\n",arr4);
printf("%p %p %p %p %p %p\n",&a,arr0,arr,arr2,arr3,arr4);
return 0;
}
结果:
[root@localhost hello]# ./a.out
Hello world 100
Hello world arr0=123456
Hello world arr=abcdeeee
Hello world arr2=2abcdeeee
Hello world arr3=32abcdeeee
Hello world arr4=4
0x7ffc2586572c 0x7ffc2586572b 0x7ffc2586572a 0x7ffc25865729 0x7ffc25865728 0x7ffc25865720
[root@localhost hello]#
4.2 说明:
1. 字符数组并不要求最后一个字符为’\0’,是否需要加入,完全由系统决定;如 arr4 加了 \0
2. 在strcpy() 函数的时候,第二个参数应该是一个字符串常量,因为函数依靠结束符\0来判定的;
综合1 和 2 可知;打印 arr1 arr2 arr3 都有前面的值 因为 之后 eeee后面有\0 才停止
而 arr4 系统添加了 \0 所以只有 4