打印
[经验分享]

C语言指针--指针中的const

[复制链接]
135|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、const
1.什么是const
const是C语言中的一种修饰符,和宏定义一样,只要定义了该变量就不能再改变了。

2.const的使用
const type variate = value;


type:类型
variate:变量名
value:值
被 const 修改后的变量的值不能对它在进行赋值了,例如下面的代码

#include <stdio.h>
int main(){
        const int a = 5;
        a = 6;
        return 0;
}



编译后

可以发现没有办法对被 const 修饰后的变量进行修改。

二、const修饰一级指针
const 放在变量中是很简单的,如果将 const 放在指针中的情况会很复杂,现在来一一讲解。

1.const放在 * 左边
#include <stdio.h>
int main(){
        int a = 5, b = 10;
        const int* pa = &a;
        return 0;
}


这种情况是让指针变量pa中的内容不改变,而地址可以改变。
比如对pa的地址进行改变

#include <stdio.h>
int main(){
        int a = 10, b = 20;
        const int* pa = &a;
        pa = &b;
        printf("%d\n", *pa);
        return 0;
}


运行的结果



如果对pa地址对应的内容进行修改

#include <stdio.h>
int main(){
        int a = 10, b = 20;
        const int* pa = &a;
        *pa = b;
        printf("%d\n", *pa);
        return 0;
}


会出现错误



所以当const放在*左边时,只能对指针变量存放的地址进行修改,但不能对地址对应内容呢进行修改。

2.const在*右边
#include <stdio.h>
int main(){
        int a = 5, b = 10;
        int* const pa = &a;
        return 0;
}


还是和上面的使用一样
重新赋值内容

#include <stdio.h>
int main(){
        int a = 5, b = 10;
        int* const pa = &a;
        pa = &b;
        return 0;
}




会发现没法通过编译,因为 const 在 * 的右边是修饰指针变量的,让指针变量里面的内容不发生改变



三、const修饰二级指针
1.const修饰**前
#include <stdio.h>
int main(){
        int a = 5, b = 10;
        int* pa = &a;
        int* pb = &b;
        const int ** ppa = &pa;
        **ppa = 28;
        return 1;
}


const 修饰在 ** 前修饰的内容是 **ppa ,也就是 **ppa 中所对应的内容不会被修改,所以第7行语句会报一个错误



但这里会发现存在一个警告,因为二级指针中的一级指针不是使用 const 的进行修饰,所以为了解决这个问题,需要在一级指针前面添加一个 const 进行修饰。

#include <stdio.h>
int main(){
        int a = 5, b = 10;
        const int* pa = &a;
        int* pb = &b;
        const int ** ppa = &pa;
        **ppa = 28;
        return 1;
}


这样就不存在警告了。

2.const修饰**中间
#include <stdio.h>
int main(){
        int a = 5, b = 10;
        int* pa = &a;
        int* pb = &b;
        int * const * ppa = &pa;
        *ppa = &b;
        return 1;
}


const 修饰在 ** 中间,本质上修饰 *ppa 中的内容,如果改变 *ppa 中存放的地址,会报错



3.const修饰**右边
#include <stdio.h>
int main(){
        int a = 5, b = 10;
        int* pa = &a;
        int* pb = &b;
        int** const ppa = &pa;
        ppa = &pb;
        return 1;
}


这修饰的是 ** 右边的内容,也就是修饰 ppa ,所以 ppa 中的内容是不能被修改的



总结
const 对于指针的修饰情况有很多,级数越高的指针,产生的全款就会越多,所以一般都只考虑 const 到二级指针的情况,更高级的指针不会考虑。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/zagzag001/article/details/125018571

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

176

主题

4190

帖子

5

粉丝