mxwawaawxm 发表于 2020-8-19 11:29

C语言指针与const关键词

本帖最后由 mxwawaawxm 于 2020-8-20 20:58 编辑

第1个问题

之前看视频看到const关键词和指针的位置,各有代表的意思    int a=9, b=10;
    int const *p1 = &a;
    const int *p1 = &a;
以上的写法,const写在*前面,表示不能通过解引用指针来改变指针指向的变量的值
    int a=9, b=10;
    int * const p2 = &a;
这种写法,const写在*后面,代表指针是常量,不能修改指针变量的值


接下来,const关键词跟数组联系起来,比如
    const int num[] = {1, 2, 3};
这样表示数组内的元素都是常量,不能修改值


再接着,字符串数组就出现问题了,比如,
    const char *str1[] = {"ab", "cd", "ef"};
    const char *str2 = "gh";
    *str1 = str2;
    printf("%s\n", *str1);
这里的数组str1,存放了3个char *指针。结果数组里的元素---指针可以改变值。
这里的const代表的是不能更改这三个字符串"ab", "cd", "ef"
同样加了const关键词,这怎么看起来好像跟int数组的规律不一样了。上面数组的元素不能修改值,这里却可以改变值{:301_985:}
那么const关键词在*号前和后,如何理解呢{:301_985:}


第2个问题
顺着上面的想法,弄一个字符串的二维数组
    const char *str3[] = {
      {"ab", "cd"}, {"ef", "gh"}
    };
    const char *str4[] = {"xy", "za"};
    *str3 = str4;
结果这样又报错了error: assignment to expression with array type
上面的字符串一维数组,加了const,可以改变里面的元素指针的值
到这里字符串二维数组,也加了const,结果不能更改里面的元素一维数组

str4是一个二级指针
而str3是char *指针
str3也是char *指针的指针,也即二级指针
另外,str3存放str3的地址,这样推下去str3是三级指针const char ***{:301_985:}
但最后编译时,却一定得把str3的类型理解为const char * (*)
我的理解哪里错了,请大侠们指导{:301_985:}

张傻子 发表于 2020-8-19 11:50

const好像有一个顶层const和底层const!

110006600 发表于 2020-8-19 12:11

二级指针变量 不是应该char** str吗?

JuncoJet 发表于 2020-8-19 12:28

我选择不const也不static

mxwawaawxm 发表于 2020-8-19 12:47

110006600 发表于 2020-8-19 12:11
二级指针变量 不是应该char** str吗?
const char *str4[] = {"xy", "za"};
数组不是数组首元素的地址吗
那str4的类型就应该是const char **吗{:301_985:}

110006600 发表于 2020-8-19 13:03

mxwawaawxm 发表于 2020-8-19 12:47
const char *str4[] = {"xy", "za"};
数组不是数组首元素的地址吗
那str4的类型就应该是const char ** ...

我也不懂,还回给老师了!还望大佬来解答,我认为定义const是不可变吧?

爱情海玩偶 发表于 2020-8-19 13:12

百度:在C语言中,const变量只不过是修饰该变量名,它并不能使内存变为只读。也就是说,块我们不能通过变量名再去操作这内存。但是可以通过其它方法,如指针,通过指针是可以修改被const修饰的那块内存的。
我记得数组好像不能直接赋值啊,会报错啊

白糅绾 发表于 2020-8-19 13:43

        int a = 10;
        int b = 20;


        int* const p = &a;//指针常量 常量可以改    p = &a是因为要把a的地址给指针p保存
        //int* const temp;(错误)//指针常量 常量可以改 但是必须要有一个明确地址给指针,如果指针不明确等于没有指定地址保存常量的东西 所以必须有指定地址给指针 int* const temp = 数据地址
        *p = b;
        cout << *p << endl;


        const int* p2;//常量指针 指针可以改可以选择定义指针的时候   确定指针保存的地址 或 不确定
        //const int* temp2;(正确)//常量指针 指针可以改 可以不需要明确指定地址给指针 因为确认了指针都是可以变化的,所以有明确地址给指针保存毫无意义
        p2 = &b;
        cout << *p2 << endl;


        const int* const p3 = &a;//const修饰指针同时修饰常量 指针常量都不可改    p3 = &a是因为要把a的地址给指针p3保存
        //const int* const temp3;(错误)//const修饰指针同时修饰常量 指针常量都不可改 都是明确指定的指针和常量,所以必须有指定地址给指针const int* const temp3 = 数据地址
        p3 = &b;
        cout << *p3 << endl;

mxwawaawxm 发表于 2020-8-19 19:56

白糅绾 发表于 2020-8-19 13:43
int a = 10;
        int b = 20;



谢谢。不过你这个回答也跟我上半部分的描述差不多
int* const p,p指针不能修改值

const int* p2或者int const* p2,表示不能通过解引用指针p来修改指向的变量的值

但我的疑问是,const与数组、字符指针数组结合的情况
const int num[] = {1, 2, 3};
上面表示数组里的元素不能更改值

const char *str1[] = {"ab", "cd", "ef"};
const char *str2 = "gh";
*str1 = str2;
但到了这种字符指针数组的情况,数组的元素指针是可以修改的{:301_985:}为什么呢

110006600 发表于 2020-8-19 23:12

本帖最后由 110006600 于 2020-8-19 23:19 编辑

不好意思,我理解错误!
页: [1] 2 3
查看完整版本: C语言指针与const关键词