zoukankan      html  css  js  c++  java
  • 谈谈 char *num="123";和char num[4]="123";的区别

    最近写程序的时候发现这样一个问题

    #include<iostream>
    #include <string.h>
    using namespace std;
    
    void reverse(char *str)
    {
        int len=strlen(str);
        char *p=str;
        char *q=str+len-1;
        while(p<q)
        {
            char temp=*p;
            *p=*q;
            *q=temp;
            p++;
            q--;
        }
    }
    int main()
    {
        char *n1="123";
        char n2[4]="456";
        reverse(n1);
        reverse(n2);
        return 0;
    }

    执行reverse(n1);的时候会出现下面的错误,而如果把这句注释掉执行reverse(n2);却能顺利运行

      现在的主要问题是初始化一个字符数组和初始化一个指向字符串的指针的区别,前者可以通过指针改变字符串的单个内容,而后者却不可以,想不明白,于是查阅书籍,在

    《C Primer Plus 第五版》 关于字符串的一章中找到了答案。

    下面将程序进一步简化,以观察重点:

    1、只在程序中写下面两句程序,程序顺利运行

        char n1[4]="123";
        n1[0]='1';

    2、只在程序中写下面两句程序,程序运行出错,错误和上面的一样

        char *n2="123";
        n2[0]='1';

    为什么会出错呢?书中给的解释是:编译器可能选取内存中同一个单个的拷贝来表示所有相同的字符串文字,如果允许用指针改变字符串的某些字符,会导致其他地方引用字符串出错。

    书中给的建议是初始化字符串指针的时候使用const修饰,这样就可以避免在使用的时候发现错误了,当然这样只是将运行错误变成编译错误。

  • 相关阅读:
    用js实现一个简单的mvvm
    ~~~持续更新,面向对象的编程,个人浅见
    前端直播功能开发总结
    echarts饼图去除鼠标移入高亮
    外包项目的感悟
    white-space:pre-wrap和word-break:break-all;
    转行两年,工作一年年,谈谈浅见
    html2canvas
    js点滴
    常用工具链接
  • 原文地址:https://www.cnblogs.com/bewolf/p/5054388.html
Copyright © 2011-2022 走看看