char* char a[] 的详解
char*
char*p,表示p是指向字符串的指针
这是个指针变量,只占四个字节,32位,用来保存一个地址。
char a[]
表示的是一个字符串数组, a代表字符串的首地址
char* get_str1()
{
char str[] = {"abcd"};
return str;
}
char* get_str2()
{
char *str = {"abcd"};
return str;
}
在函数get_str1中,char str[] = { "abcd" },定义的是一个局部变量,该函数返回的是内部局部字符数组str的地址,当函数调用之后该数组被销毁,所以返回的指针是一个已经释放了空间的指针,指向的值不定。
在函数get_str2中,char* str = { "abcd" },先定义一个字符串常量“abcd“,再将指针str指向它,返回值是这个指针,由于字符串常量在编译时分配内存,只有程序退出时才被销毁,所以返回它的地址没有问题。
1)char s[5];
s = "abcd"; //错误
2)char *s;
s = "abcd"; //正确
1编译不通过但是2编译通过。这是因为在1中,s是数组名,当成是常量指针,不可以作为左值修改;而2中s是一个指针变量,可以将其指向一个字符串常量。
char * 与 char a[] 的本质区别:
当定义 char a[10] 时,编译器会给数组分配十个单元,每个单元的数据类型为字符。
定义 char *s 时, 这是个指针变量,只占四个字节,32位,用来保存一个地址。
sizeof(a) = 10 ;
sizeof(s) = ?
当然是4了,编译器分配4个字节32位的空间,这个空间中将要保存地址。
printf("%p",
这个表示 s 的单元中所保存的地址。
printf("%p",&s);
这个表示变量本身所在内存单元地址,不要搞混了。
用一句话来概括,就是 char *s 只是一个保存字符串首地址的指针变量, char a[] 是许多连续的内存单元,单元中的元素为char 。
深入理解char * ,char ** ,char a[ ] ,char *a[] - Z--Y - 博客园 (cnblogs.com)
[(C++)三种常用的字符串表示方法——char* 和 char] - 小念子 - 博客园 (cnblogs.com)