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

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

      

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

    *pstr1 = “11111”;
    

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

      

      那么为什么数组可以呢?

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

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

  • 相关阅读:
    【Git】分支管理
    【Java】jprofiler工具初上手
    【中间件】JMS
    【Idea】编译问题Intellij Error: Internal caches are corrupted or have outdated format
    【测试】测试用例选择
    【DevOps】
    【Unix】z/OS系统
    【数据库】表空间释放
    【数据库pojo类】Oracle数据库中各数据类型在Hibernate框架中的映射
    基于闭包实现的显示与隐藏
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/13858499.html
Copyright © 2020-2023  润新知