char *a与char a[]区别:
char *a = "hello"; //a指向字符串常量"hello"的首地址,a存放在栈上,"hello"保存在文字常量区
char a[] = "hello"; //数组名a也是指向字符串的首地址,a,"hello"都存放在栈上。
两者之间的区别:
将两个字符串相加:
#include <stdio.h>
#include <string.h>
int main()
{
char *p = "123456";
char a[20] = "hello";
strcat(a, p);
printf("%s\n", a);
return 0;
}
结果:hello123456
对比:
#include <stdio.h>
#include <string.h>
int main()
{
char *p = "123456";
char a[20] = "hello";
strcat(p, a);
printf("%s\n", p);
return 0;
}
结果:Segmentation fault (core dumped)
分析:a数组地址空间是在栈中分配,可读取可修改,p指针指向的对象"123456\0"存放在文字常量区,只能读取,无法修改。
两者区别:
- 读写能力
char *a = "abcd"; 此时"abcd"存放在常量区,通过指针只可以访问字符串常量,而不可以改变它。
char a[] = "abcd"; 此时 "abcd"存放在栈。可以通过指针去访问和修改数组内容。
- 赋值时刻
char *a = "abcd"; 在编译时就确定了(因为是常量)
char a[] = "abcd"; 在运行时确定
- 存取效率
char *a = "abcd"; 存于静态存储区。在栈上的数组比指针所指向字符串快。因此慢
char a[] = "abcd"; 存于栈上,快。
参考:
https://www.jb51.net/article/100181.htm
https://blog.csdn.net/xiadeliang1111/article/details/90573084