木木guainv 发表于 2025-2-18 19:07

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

一、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 修饰指针时**,关键要明确修饰的是指针本身还是指针指向的数据。

iyoum 发表于 2025-3-11 15:01

在函数参数中使用 const 指针可以保护数据不被意外修改,同时允许函数内部读取数据。

saservice 发表于 2025-3-11 15:33

const关键字与指针结合时,其位置决定了指针或指针指向的数据是否可修改

updownq 发表于 2025-3-11 16:16

int *const p;:指针 p 是 const 的,不能改变 p 本身的值,但可以通过 p 修改指向的内容。

pixhw 发表于 2025-3-11 16:45

指针 p 指向的数据是不可变的,但指针本身的地址可以改变。

jkl21 发表于 2025-3-12 16:40

声明一个 const 指针时,const 的位置决定了指针本身是否是常量,以及它指向的数据是否是常量。

hearstnorman323 发表于 2025-3-12 19:23

指针本身的值不能被修改,但可以通过该指针修改它所指向的数据的值。

51xlf 发表于 2025-3-12 20:31

const int *const p;:指针 p 和 p 指向的内容都是 const 的,不能改变 p 本身的值,也不能通过 p 修改指向的内容。

belindagraham 发表于 2025-3-14 10:26

语法形式        修饰对象        是否可变
const T *p        指向的数据        数据不可变,指针可变
T *const p        指针本身        指针不可变,数据可变
const T *const p        指针和数据        均不可变

pmp 发表于 2025-3-14 13:06

当一个指针被声明为指向const数据时,这意味着通过这个指针不能修改它所指向的数据。但是,指针本身(即指针变量的值)是可以被修改的,可以指向不同的地址。

mikewalpole 发表于 2025-3-15 03:46

使用 const int *const p; 可以同时保护数据和指针,适用于需要严格保护的数据和指针。

lihuami 发表于 2025-3-15 03:58

const 修饰指针的主要目的是限制指针的可变性,以保护数据不被意外修改。

qiufengsd 发表于 2025-3-15 04:11

const int x = 10;
const int *p = &x; // p指向x,不能修改x的值
*p = 20;         // 编译报错!
p = &y;         // 合法,可以指向其他常量

tabmone 发表于 2025-3-15 04:23

指针指向的数据不是常量,但是指针本身是常量,即你不能改变指针所指向的地址。

jackcat 发表于 2025-3-15 10:34

优先使用 const T *p 而非 T *const p,除非指针地址本身需要固定。

ingramward 发表于 2025-3-15 13:44

使用 const 的核心目的是保护数据或明确接口约束。

youtome 发表于 2025-3-15 16:04

C语言中的const关键字与指针结合使用时,可以形成指向常量的指针、指针常量以及指向常量的指针常量等多种组合。
页: [1] 2 3
查看完整版本: C语言指针--指针中的const