《C语言知识点 —— 字符串指针和字符串数组的区别》

  看一个例子:

#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是一个仅仅足以存放初始化字符串以及空字符'\0'的一维数组。数组中的单个字符可以进行修改,但pstr2始终指向同一个存储位置。

  pstr1是一个指针,其初值指向一个字符串常量。不能通过该地址去修改该字符串常量。之后它可以被修改以指向其他地址。

  

  假如本来存放"this is a test"这个字符串常量的地址是0x100000f33。

*pstr1 = “11111”;

  现在通过寻址符去访问该地址等价于*0x100000f33。然后要去改变地址中的字符串常量。这个是不被允许的,因为字符串常量是只读。

  

  那么为什么数组可以呢?

  字符串一旦被创建就存在于常量池中。

  以字符数组形式创建的字符串,实际上是从字符串常量池中复制了一个副本,所以修改字符数组的内容时,只是修改的自己的副本,并不会影响到常量池中的字符串。而对字符串指针strp操作时会影响到常量池中的字符串

 

posted @ 2020-10-22 15:21  一个不知道干嘛的小萌新  阅读(304)  评论(0编辑  收藏  举报