zoukankan      html  css  js  c++  java
  • 关于字符串指针不可修改的问题

    C/C++ code

    char*m ="hello"; *(m+1) ='s'; for(;*m !='\0';m++){ printf("%c\n",*m); }


    但是出运行时错误。
    ----------------------------------------------------------
    我用数组下标的方式是可以修改的:

    C/C++ code
    int i =0; char w[] ="hello"; w[1] ='s'; while(w[i] !='\0'){ printf("%c\n",w[i]); i++; }
     
     
     
    答复一:
    char *m = "hello";
    "hello"保存在静态数据区,该数据不能修改.
    由指针m指向. 不能通过指针m来修改静态数据区的值.

    char w[] = "hello";
    "hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
    可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.
     
    疑问:
    这种说法是错误的。如下:
     static int a = 10;
     int *b = &a;
     *b = 20;
     cout<<a<<endl;
    输出结果为20.我们依然通过指针修改了存储在静态存储区里的数据源。
     
    //---------------------------------------------------
    答复二:
     
    字符串“hello”本身就是一个常量字符指针,而对于指针m,无非就是一个地址的拷贝,也就是“hello”地址的拷贝,相当于m指向一个字符串常量,字符串常量是不予许改变的!

    而对于w[]来说就不一样了,虽然hello本身是常量,不过此时拷贝给w[]的不是地址,而是内容,也就是“hello”,也就是w本身拥有一个自己的hello副本,可以对其进行想要的合法操作,比如改变等!!
     
     
    回复三:
    char *m = "hello";
    "hello"保存在文字常量区,该数据不能修改,默认有只读属性.
    由指针m指向. 不能通过指针m来修改此值.

    char w[] = "hello";
    "hello"保存在栈空间数组里. 数组名为w, 函数名为数组的首地址.
    可以通过w[i]='a', 或*(w+i)='a'的形式来修改数组内容.
  • 相关阅读:
    iOS
    iOS
    iOS The problems that i encountered
    HTTP STATUS CODE
    MySQL死锁导致无法查询的问题
    JAVA 响应时,按照指定的日期格式返回
    easy额xcel 生成Excel表并返回浏览器弹出下载的简单实现
    Byte数组和字符串相互转换的问题
    Springboot 使用过滤器进行加密解密(二)
    Springboot 部署到linux(二)
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2705776.html
Copyright © 2011-2022 走看看