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