吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1455|回复: 23
收起左侧

[求助] C语言指针与const关键词

[复制链接]
mxwawaawxm 发表于 2020-8-19 11:29
本帖最后由 mxwawaawxm 于 2020-8-20 20:58 编辑

第1个问题

之前看视频看到const关键词和指针的位置,各有代表的意思
[C] 纯文本查看 复制代码
    int a=9, b=10;
    int const *p1 = &a;
    const int *p1 = &a;

以上的写法,const写在*前面,表示不能通过解引用指针来改变指针指向的变量的值
[C] 纯文本查看 复制代码
    int a=9, b=10;
    int * const p2 = &a;

这种写法,const写在*后面,代表指针是常量,不能修改指针变量的值


接下来,const关键词跟数组联系起来,比如
[C] 纯文本查看 复制代码
    const int num[] = {1, 2, 3};

这样表示数组内的元素都是常量,不能修改值


再接着,字符串数组就出现问题了,比如,
[C] 纯文本查看 复制代码
    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数组的规律不一样了。上面数组的元素不能修改值,这里却可以改变值
那么const关键词在*号前和后,如何理解呢


第2个问题
顺着上面的想法,弄一个字符串的二维数组
[C] 纯文本查看 复制代码
    const char *str3[][2] = {
        {"ab", "cd"}, {"ef", "gh"}
    };
    const char *str4[] = {"xy", "za"};
    *str3 = str4;

结果这样又报错了error: assignment to expression with array type
上面的字符串一维数组,加了const,可以改变里面的元素指针的值
到这里字符串二维数组,也加了const,结果不能更改里面的元素一维数组

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

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

张傻子 发表于 2020-8-19 11:50
const好像有一个顶层const和底层const!
110006600 发表于 2020-8-19 12:11
JuncoJet 发表于 2020-8-19 12:28
 楼主| mxwawaawxm 发表于 2020-8-19 12:47
110006600 发表于 2020-8-19 12:11
二级指针变量 不是应该char** str[4]吗?

const char *str4[] = {"xy", "za"};
数组不是数组首元素的地址吗
那str4的类型就应该是const char **吗
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;

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
hak88 + 1 + 1 用心讨论,共获提升!

查看全部评分

 楼主| 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;
但到了这种字符指针数组的情况,数组的元素指针是可以修改的为什么呢
110006600 发表于 2020-8-19 23:12
本帖最后由 110006600 于 2020-8-19 23:19 编辑

不好意思,我理解错误!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-16 06:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表