zoukankan      html  css  js  c++  java
  • 《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操作时会影响到常量池中的字符串

  • 相关阅读:
    js 各种常用js验证
    js url校验
    最近遇到的技术问题
    a标签的target的四个值
    新系统用到的新知识
    7 天打造前端性能监控系统
    前端必读:浏览器内部工作原理
    怎么判断ThreadPool线程池里的任务都执行完毕
    docker 在window 10 专业版的安装 && .net core 在docker的部署
    .net core 中后台获取前台 数据(post)的方法
  • 原文地址:https://www.cnblogs.com/zhuangquan/p/13858499.html
Copyright © 2011-2022 走看看