指针和const
当一个变量使用const修饰后不允许改变他的值,那么使用const修饰指针会怎么样。
根据const位置的不同有三种效果,原则是修饰谁,谁的内容就不可变,其他的都可变
const int*p=&a;
同样const和int可以互换位置,二者是等价的,
当把const放最前面的时候,他修饰的就是p,那么p就不可变。*p表示的是指针变量p所指向的内存单元里面的内容,此时这个内容不可变。其他的都可变,如p中存放的是指向的内存单元的地址,这个地址可变,即p的指向可变。但指向谁,谁的内容就不可变。
这种方法常用于定义函数的形参,前面学习的printf和scanf,他们的原型中很多参数都是用const修饰的,这样做的好处是安全!当我们通过参数传递数据时,就把数据暴露了。而大多数时候只是想使用传过来的数据,并不像改变他的值,这样在形参中用const把传过来的数据定义成只读,这也是其最有用的。
如果不想改变某个参数传递过来的值,那么定义函数时最好用const修饰
int*const p=&a;
此时 const 修饰的是 p,所以 p 中存放的内存单元的地址不可变,而内存单元中的内容可变。即 p 的指向不可变,p 所指向的内存单元的内容可变。
const int*const p=&a;
此时 *p 和 p 都被修饰了,那么 p 中存放的内存单元的地址和内存单元中的内容都不可变。
综上所述,使用 const 可以保护用指针访问内存时由指针导致的被访问内存空间中数据的误更改。因为指针是直接访问内存的,没有拷贝,而有些时候使用指针访问内存时并不是要改变里面的值,而只是要使用里面的值,所以一旦不小心误操作把里面的数据改了就糟糕了。
但是这里需要注意的是,上面第 1 种情况中,虽然在 *p 前加上 const 可以禁止指针变量 p 修改变量 a 中的值,但是它只能“禁止指针变量 p 修改”。也就是说,它只能保证在使用指针变量 p 时,p 不能修改 a 中的值。但是我并没有说 const 可以保护 a 禁止一切的修改,其他指向 a 的没有用 const 修饰的指针变量照样可以修改 a 的值,而且变量 a 自己也可以修改自己的值。下面写一个程序看一下:
# include <stdio.h>
int main(void)
{
int a = 10;
const int *p = &a;
int * q = &a;
*q = 20;
printf("a = %d\n", a);
a = 30;
printf("a = %d\n", a);
//*p = 30; //这么写就是错的
return 0;
}
输出结果是:
a = 20
a = 30
可见,只有用 const 修饰过的指针变量 p 不能修改 a 中的内容,而没有用 const 修饰过的指针变量 q 照样可以修改 a 中的内容,而且 a 自己也可以重新给自己赋值。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现