服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

C++ 面试常考:const 修饰指针的三种效果

日期: 来源:字节流动收集编辑:

前面讲过,当一个变量用 const 修饰后就不允许改变它的值了。那么如果在定义指针变量的时候用 const 修饰会怎样?同样必须要在定义的时候进行初始化。比如:

int  a;
int  *p = &a;

当用 const 进行修饰时,根据 const 位置的不同有三种效果。

原则是:修饰谁,谁的内容就不可变,其他的都可变。这三种情况在面试的时候几乎是必考的,在实际编程中也是经常使用的,所以初学者一定要掌握。

const int*p=&a;

同样 const 和 int 可以互换位置,二者是等价的。我们以放在最前面时进行描述。

当把 const 放最前面的时候,它修饰的就是 *p,那么 *p 就不可变。*p 表示的是指针变量 p 所指向的内存单元里面的内容,此时这个内容不可变。其他的都可变,如 p 中存放的是指向的内存单元的地址,这个地址可变,即 p 的指向可变。但指向谁,谁的内容就不可变。

这种用法常见于定义函数的形参。前面学习 printf 和 scanf,以及后面将要学习的很多函数,它们的原型中很多参数都是用 const 修饰的,这样做的好处是安全!我们通过参数传递数据时,就把数据暴露了。

而大多数情况下只是想使用传过来的数据,并不想改变它的值,但往往由于编程人员个人水平的原因会不小心改变它的值。这时我们在形参中用 const 把传过来的数据定义成只读的,这样就更安全了。这也是 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 自己也可以重新给自己赋值。

来源:http://c.biancheng.net/view/218.html


-- END --


进技术交流群,扫码添加我的微信:Byte-Flow



获取相关资料和源码



推荐:

Android FFmpeg 实现带滤镜的微信小视频录制功能

全网最全的 Android 音视频和 OpenGL ES 干货,都在这了

一文掌握 YUV 图像的基本处理

抖音传送带特效是怎么实现的?

所有你想要的图片转场效果,都在这了

面试官:如何利用 Shader 实现 RGBA 到 NV21 图像格式转换?

我用 OpenGL ES 给小姐姐做了几个抖音滤镜

相关阅读

  • 如何在 NDK 开发的时候定位 Native 层的内存泄漏?

  • 一、为什么要定位Native层的内存泄漏?最近做一个OpenGL ES项目,使用C++来实现的。在自测阶段,发现内存有泄漏,特别是Native内存泄漏的很明显。如下所示:刚开始启动应用的时候,只打
  • 开门红?啪啪打脸!

  • 兔年第 1更,说个大喜事——节前最后一个交易日,星球下注了中国中免~ 虽然过去 3年中免在春节行情中不尽人意…但我对脱口罩后首个春节消费力有向好的期待~上周外围市场天晴了
  • 别小看!你能捡回多少钱?

  • 你有从一副口袋里摸出“意外之财”的经历吗?证监会在上周末干了件好人好事儿——推出了基金账户一证通查的APP!目的是解决基民遗忘账户、查询繁琐的问题,帮助大家找回被遗失在
  • ChatGPT 取代不了咱!

  • chatGPT的爆火,以至于新闻漫天飞,资本市场也天天抄,A股里都是些什么玩意儿,大家也清楚,参与的拦不住,不感兴趣的也不必我多言,我这儿就不聊了...抛开投资,我更关心自己会不会被AI替
  • “贷”代相传的故事!

  • 播报一则大喜讯...前天晚上紧赶慢赶录制的播客上热门了!在这里,我要特别感谢【小宇宙】平台这个伯乐!以及特别感谢来自十亿身家俱乐部和别墅靠海大本营两个读者群的倾力帮助,尤
  • 我的买入,上涨没有秘密!

  • 对我们来说,投资等于出去赌马。我们要寻找一匹获胜几率是两分之一,赔率是一赔三的马。你要寻找的是标错赔率的赌局。这就是投资的本质。你必须拥有足够多的知识,才能知道赌局的
  • 投顾来了 | 喜迎开门红,兔年该如何规划布局?

  • 市场信心有所恢复,如何把握节后机遇?兔年如何规划布局基金投资?投顾来了,与您一探究竟!2月1日(今日)下午15:00投顾主播小顾姐姐、文韬相约「投顾来了」直播间,为您解读市场关于后市
  • ECMAScript Async Context 提案介绍

  • 背景由阿里巴巴 TC39 代表主导的Async Context 提案[1] 刚在 2023年 2 月初的 TC39 会议中成为了 TC39 Stage 1 提案。提案的目标是定义在 JavaScript 的异步任务中传递数据

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • C++ 面试常考:const 修饰指针的三种效果

  • 前面讲过,当一个变量用 const 修饰后就不允许改变它的值了。那么如果在定义指针变量的时候用 const 修饰会怎样?同样必须要在定义的时候进行初始化。比如:int a;int *p = &a;
  • 如何在 NDK 开发的时候定位 Native 层的内存泄漏?

  • 一、为什么要定位Native层的内存泄漏?最近做一个OpenGL ES项目,使用C++来实现的。在自测阶段,发现内存有泄漏,特别是Native内存泄漏的很明显。如下所示:刚开始启动应用的时候,只打
  • Android-Native 开发之利用 AAudio 播放音频

  • 前言谈到在Android C/C++层实现音频播放/录制功能的时候,大家可能首先会想到的是利用opensles去做,这确实是一直不错的实现方式,久经考验,并且适配比较广。但如果你的项目最低版