• char * const p,char const *p,char *str,char str[]的相关问题


    char const *p和const char *p是一个概念.

    char * const p; p为指向字符变量的指针,地址不变,地址内容可变

    const  char *p; p为指向字符变量的指针,地址可变,地址内容不变
    *在const前表示指针为常量,只能初始化,初始化后就不能再指向别的地址,但是可以改变指针指向的变量的值。
    const在*前面,表示指针指向的值为常量,但是指针可以指向不同的变量。

     

    程序1:
    #include<iostream>
    using namespace std;
    char *str()
    {
    char *str="hejk ";
    return str;
    }
    void main()
    {
    str();
    }


    程序2
    #include<iostream>
    using namespace std;
    char *str()
    {
    char str[]="hejk ";
    return str;
    }
    void main()
    {
    str();
    }
    为什么程序2会告警说返回巨变变量,而程序1不会。程序1中定义的str不也是局部变量吗?

    char *str="hejk ";
    建议写成:
    const char *str="hejk ";
    保存在静态存储区,返回后依然存在,所以没有警告。

    而char str[]="hejk ";的空间是在栈上,return后,就消亡了,所以会警告。

    char *str = "hejk ";
    这样写,就相当于:
    const char *str = "hejk ";
    str指向的是常量字符串
    存储在静态存储区。

    如果你试图通过:
    str[0] = 'a';
    str[1] = 'b';
    这样的代码去修改str所指向的字符串
    就会出错。

     

    我靠,都在胡说八道啊,这是什么论坛……

    首先,数组和指针是不同的数据类型,有本质的区别:
    char str[] = "hejk"; //sizeof(str) == 5 * sizeof(char)
    char * str = "hejk"; //sizeof(str) == 4(x86) or 8(x64)
    数组可以自动转型成指针,指针不能转成数组。

    然后,字符串等价于字符数组,而不等于字符指针。根据上一条,字符串可以自动转型成字符指针。

    再然后,"hejk"叫做“字符串字面量”,任何类型的字面量都是右值(没有名字的临时变量),必须让"hejk"成为左值(有名字的变量),才能够修改"hejk"这个字符串。
    char str[] = "hejk";//等号两端是相同的数据类型,右值成为左值
    char * str = "hejk";//等号两端是不同的数据类型,右端自动转型成char*,该char*得到了str的名字,而"hejk"这个char数组仍然没有名字

    最后,"hejk"是局部字符数组,楼主的两个函数,在返回之后,"hejk"都将不复存在,而返回的值就是不复存在的数组的首地址,所以楼主的两个函数都是错误的,正确的是这样的:
    char * str( )
    {
    static char str[] = "hejk";
    return str;
    }
    静态局部数组被放在“全局变量区”,函数返回后,数组作为全局变量仍然存在。

    .以上内容来自于csdn的帖子整理,虽然不见得全部正常,至少可以有所了解.

     

  • 相关阅读:
    linux centos7 防止暴力破解
    win10 配置git 环境变量
    Tengine的说明
    php composer 报错 requires php ^7.1.8 || ^8.0 -> your php version
    uni-app v-for循环遍历 动态切换class、动态切换style
    Tomcat安装与配置
    我的云服务之WWW
    RHEL7 单独安装图形 X11
    python3-sql解析库——sqlparse
    Python3实战——爬虫入门
  • 原文地址:https://www.cnblogs.com/wmx3ng/p/2775968.html
Copyright © 2020-2023  润新知