回复 8楼 weishen2011
这一点主要和内存分配有关
虽然指针变量都分配在栈上(就这题而言)。也就是说它们都是局部变量
但是指针指向的内存可以是任意的,可以使常量存储区,可以使堆上,当然也可以使栈上
但是数组时局部分配,在栈上分配内存
也就是说你定义的指针变量分配在了栈上,但是指向确实在常量存储区(要注意你修改的是指向的内容,而不是指针,因此才会造成这种差异)
但是数组指向的内存分配在栈上,虽然你用常量字符串给他初始化,但是(也许)那只是一个副本,给数组赋初值赋值以后,你修改的是数组中的内容
是栈上的内存,和字符串常量没关系了。即使你改变数组内的内容,但是字符串常量内容不会变化的
看下面这段代码:
程序代码:
#include <stdio.h>
int main()
{
char *p = "abcde";
char s[] = "abcde";
s[1] = 'x';
printf("%s\n",p);
return 0;
}
输出是“abcde”而不是“axcde”就说明这个问题
另外注意之所以能用这个例子演示解释!一个主要的原因是:编译器的优化!当编译器发现两个相当的常量字符串,把它们优化为一个!如果没有这个前提,这样举例是不合理的,毕竟没法保证第一行和第二行的两个字符串常量是一个!