打印
[经验分享]

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

[复制链接]
1642|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一、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

使用特权

评论回复
沙发
albertaabbot| | 2025-3-9 21:25 | 只看该作者
int value = 5;
const int *const ptr = &value;
*ptr = 10; // 错误!不能通过ptr修改value
ptr = &anotherValue; // 错误!不能改变ptr指向的地址

使用特权

评论回复
板凳
biechedan| | 2025-3-9 21:32 | 只看该作者
const int *p;,这里p是一个指向整数常量的指针,*p(即p所指向的数据)是不可修改的,但p本身的值(即它所存储的地址)是可以改变的。

使用特权

评论回复
地板
alvpeg| | 2025-3-10 18:20 | 只看该作者
**const 修饰指针时**,关键要明确修饰的是指针本身还是指针指向的数据。

使用特权

评论回复
5
iyoum| | 2025-3-11 15:01 | 只看该作者
在函数参数中使用 const 指针可以保护数据不被意外修改,同时允许函数内部读取数据。

使用特权

评论回复
6
saservice| | 2025-3-11 15:33 | 只看该作者
const关键字与指针结合时,其位置决定了指针或指针指向的数据是否可修改

使用特权

评论回复
7
updownq| | 2025-3-11 16:16 | 只看该作者
int *const p;:指针 p 是 const 的,不能改变 p 本身的值,但可以通过 p 修改指向的内容。

使用特权

评论回复
8
pixhw| | 2025-3-11 16:45 | 只看该作者
指针 p 指向的数据是不可变的,但指针本身的地址可以改变。

使用特权

评论回复
9
jkl21| | 2025-3-12 16:40 | 只看该作者
声明一个 const 指针时,const 的位置决定了指针本身是否是常量,以及它指向的数据是否是常量。

使用特权

评论回复
10
hearstnorman323| | 2025-3-12 19:23 | 只看该作者
指针本身的值不能被修改,但可以通过该指针修改它所指向的数据的值。

使用特权

评论回复
11
51xlf| | 2025-3-12 20:31 | 只看该作者
const int *const p;:指针 p 和 p 指向的内容都是 const 的,不能改变 p 本身的值,也不能通过 p 修改指向的内容。

使用特权

评论回复
12
belindagraham| | 2025-3-14 10:26 | 只看该作者
语法形式        修饰对象        是否可变
const T *p        指向的数据        数据不可变,指针可变
T *const p        指针本身        指针不可变,数据可变
const T *const p        指针和数据        均不可变

使用特权

评论回复
13
pmp| | 2025-3-14 13:06 | 只看该作者
当一个指针被声明为指向const数据时,这意味着通过这个指针不能修改它所指向的数据。但是,指针本身(即指针变量的值)是可以被修改的,可以指向不同的地址。

使用特权

评论回复
14
mikewalpole| | 2025-3-15 03:46 | 只看该作者
使用 const int *const p; 可以同时保护数据和指针,适用于需要严格保护的数据和指针。

使用特权

评论回复
15
lihuami| | 2025-3-15 03:58 | 只看该作者
const 修饰指针的主要目的是限制指针的可变性,以保护数据不被意外修改。

使用特权

评论回复
16
qiufengsd| | 2025-3-15 04:11 | 只看该作者
const int x = 10;
const int *p = &x; // p指向x,不能修改x的值
*p = 20;         // 编译报错!
p = &y;           // 合法,可以指向其他常量

使用特权

评论回复
17
tabmone| | 2025-3-15 04:23 | 只看该作者
指针指向的数据不是常量,但是指针本身是常量,即你不能改变指针所指向的地址。

使用特权

评论回复
18
jackcat| | 2025-3-15 10:34 | 只看该作者
优先使用 const T *p 而非 T *const p,除非指针地址本身需要固定。

使用特权

评论回复
19
ingramward| | 2025-3-15 13:44 | 只看该作者
使用 const 的核心目的是保护数据或明确接口约束。

使用特权

评论回复
20
youtome| | 2025-3-15 16:04 | 只看该作者
C语言中的const关键字与指针结合使用时,可以形成指向常量的指针、指针常量以及指向常量的指针常量等多种组合。

使用特权

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

本版积分规则

176

主题

4210

帖子

5

粉丝