c中数组常量字符串和指针常量字符串的区别

常量字符串例如“abcde”这种的系统会将他们放在常量区,而常量区就是意味着不能修改的,只可以读取的数据区域,并且相同常量字符串只有一份。

void string2()
{
char* p = "abcde";
printf("%p\n", p);
char*p1 = "abcde";
printf("%p\n", p1);

}


如上,p1和p的地址是一样的,他们都指向的是同一个常量向量,这是编译器做的优化。

char *string1()
{
char str[20] = "abcde";
return str;
}
char* string2()
{
char* p = "abcde";
return p;
}
void main()
{
char * p = string1();
printf("%s\n", p);
char *pp = string2();
printf("%s", pp);
system("pause");
}


上面定义了一个字符数组char str[20] = "abcde";等于字符常量,还定义了一个char* p = "abcde";指针指向字符常量,同时返回他们的首地址,结果却是指针可以正确输出而数组却不可以,这是为什么呢?存的都是常量字符串。这是因为char str[20],系统给它分配了二十个字节连续的地址,然后把这篇内存的首地给受托人,最后用abcde去初始化数组,地址已经存在,内存也已经存在,所以系统会把用来初始化的常量字符串从常量区复制一份然后放入数组的内存区域中。所以数组str的内存区域hi在栈区,而栈区就是用完就会回收,所以函数结束内存被回收了从而导致了错误的结果。同时这也意味着char str[20] = "abcde”中的值是可以修改的str[1]=“t”是可以的。但是指针就是直接指向了常量区,不可以对指针指向的字符串进行修改,p[0]=“r”这种操作是不允许的,常量区是不可以修改的。

猜你喜欢

转载自blog.csdn.net/qianyayun19921028/article/details/80980345