看一个例子:
#include <stdio.h> int main() { char *pstr1 = "this is a test"; char pstr2[] = "this is a test"; sprintf(pstr1, "1"); sprintf(pstr2, "2"); return 0; }
上面的例子,一开始会打印段错误。然后把sprintf(pstr1, "1");屏蔽了。会打印2。
区别:
char *pstr1 = "this is a test"; char pstr2[] = "this is a test";
在上述声明中,pstr2是一个仅仅足以存放初始化字符串以及空字符' '的一维数组。数组中的单个字符可以进行修改,但pstr2始终指向同一个存储位置。
pstr1是一个指针,其初值指向一个字符串常量。不能通过该地址去修改该字符串常量。之后它可以被修改以指向其他地址。
假如本来存放"this is a test"这个字符串常量的地址是0x100000f33。
*pstr1 = “11111”;
现在通过寻址符去访问该地址等价于*0x100000f33。然后要去改变地址中的字符串常量。这个是不被允许的,因为字符串常量是只读。
那么为什么数组可以呢?
字符串一旦被创建就存在于常量池中。
以字符数组形式创建的字符串,实际上是从字符串常量池中复制了一个副本,所以修改字符数组的内容时,只是修改的自己的副本,并不会影响到常量池中的字符串。而对字符串指针strp操作时会影响到常量池中的字符串