[疑难问答] const修饰指针

[复制链接]
3788|28
 楼主| loutin 发表于 2025-2-21 01:17 | 显示全部楼层 |阅读模式
const修饰的变量不可直接被修改,可通过指针间接修改(int a = 10;int* p = &a;*p = 20)
const可放在类型前,也可放在类型后,建议放类型前
const int a = 10;a并不是真正的常量,因为a可以被间接修该,所以int arr[a], case a都错误
const修饰的变量并非不可被修改,那const修饰变量,意义何在?

①:让编译器直接进行修改检查,若被修改直接警告或报错
②:告诉其他程序员这个变量不要改,也属于一种自描述
char* p = "hello bit"这才是真正意义上的不可被修改(关于这块的处理需了解操作系统)
const修饰数组
代表数组中的每个元素都不可被修改

const修饰指针
指针:就是一个地址
指针变量:一个变量,用来保存地址(注意区分两者的差别)
为什么要有指针?提高CPU内存寻址的效率
地址需要开辟空间存储吗?不需要,内存中每个地方的地址是由计算机规定好的
地址为只读,不能随便改
在c中,任何变量&,全都是从最低地址开始的
左值和右值的区别
int x         x = 100 x的空间(把100放到x的空间里面),变量的属性,左值
           int y = x     x的内容,数据的属性(把x的值赋给y),右值
对指针解引用,代表指针所指向的目标



int a = 10;

const int* p = &a; int* q = p;(警告)

int* p = &a; const int* q = p; (无警告)

经验:如果把一个类型限定并不严格的变量,赋给一个类型限定非常严格的变量,编译器不会报错;如果把一个类型限定非常严格的变量,赋给一个类型限定并不严格的变量,编译器会报错

const修饰函数
在c中,任何函数传参都一定要形成临时变量,包括指针变量
const修饰函数参数:该参数不可被修改,只读

const修饰函数返回值:const int* test()告诉编译器,告诉函数调用者不要试图通过指针修改函数返回值所指向的内容


mattlincoln 发表于 2025-3-9 20:32 | 显示全部楼层
const 修饰符的位置很重要。const int *ptr 和 int *const ptr 是不同的。
backlugin 发表于 2025-3-9 20:42 | 显示全部楼层
与 const int *p; 相同,指针 p 指向的内容是 const 的,不能通过 p 修改指向的内容,但 p 本身的值可以改变。
mnynt121 发表于 2025-3-11 14:15 | 显示全部楼层
const关键字在修饰指针时的位置非常关键,它决定了是对指针指向的内容进行限制还是对指针变量本身进行限制。
hearstnorman323 发表于 2025-3-11 19:33 | 显示全部楼层
在C语言中,const 关键字可以用来修饰指针,以指定指针本身或指针所指向的数据是常量。
yorkbarney 发表于 2025-3-11 19:45 | 显示全部楼层
int a = 10;
int *const p = &a;
*p = 20; // 正确:可以修改 a 的值
p = &a;  // 错误:不能改变 p 指向的地址
olivem55arlowe 发表于 2025-3-11 19:57 | 显示全部楼层
常用组合是 const T *p(保护数据),而 T *const p(保护指针地址)较少见。
rosemoore 发表于 2025-3-11 20:10 | 显示全部楼层
当const位于*左侧时,表示指针指向的数据是常量,不能通过指针修改
linfelix 发表于 2025-3-11 20:22 | 显示全部楼层
const 修饰指针的核心是 ​明确“谁不可变”​:指针本身或指针指向的数据。
ulystronglll 发表于 2025-3-11 20:34 | 显示全部楼层
const int *p;:指针 p 指向的内容是 const 的,不能通过 p 修改指向的内容,但 p 本身的值可以改变。
int *const p;:指针 p 是 const 的,不能改变 p 本身的值,但可以通过 p 修改指向的内容。
i1mcu 发表于 2025-3-11 20:47 | 显示全部楼层
必须用括号明确修饰对象              
robertesth 发表于 2025-3-11 21:00 | 显示全部楼层
在C语言中,const关键字可以用来修饰指针,以表示指针所指向的数据不可变,或者指针本身不可变。
bestwell 发表于 2025-3-11 21:12 | 显示全部楼层
const int *p; 或 int const *p;。这两种写法是等价的
vivilyly 发表于 2025-3-11 21:25 | 显示全部楼层
同时使用const修饰指针和指向的数据,表示指针及其指向的数据均不可修改
modesty3jonah 发表于 2025-3-12 15:33 | 显示全部楼层
指针本身和它指向的数据都是常量,既不能修改指针指向的地址,也不能通过指针修改数据。
rosemoore 发表于 2025-3-12 17:13 | 显示全部楼层
使用 const 修饰指针可以提供额外的类型安全,告诉编译器该指针不应该用于修改它所指向的数据。
vivilyly 发表于 2025-3-12 17:48 | 显示全部楼层
p 是一个 const 指针,即 p 本身的值(即指针的地址)不能被修改,但 p 指向的内容可以被修改。
cemaj 发表于 2025-3-14 11:31 | 显示全部楼层
在函数参数中使用 const 可以保护输入参数不被意外修改,同时允许传递非 const 数据给 const 指针参数。
pmp 发表于 2025-3-14 15:45 | 显示全部楼层
const修饰的是指针变量本身,意味着指针变量p的值不能被改变,即它不能指向其他地址,但它所指向的变量的值是可以修改的。
uytyu 发表于 2025-3-15 15:00 | 显示全部楼层
“const指针”和“指针常量”的区别
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

1659

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部