揭秘const的神奇之处

简介: 当我们提到const时,通常会想到它作为常量的用途。然而,实际上它的最大魅力在于可以修饰函数的参数和返回值。在本文中,我将为您揭开关于const的一些秘密。

目录

前言

  1. 用const修饰函数的参数
    • 参数为输出类型的情况
    • 参数采用指针传递方式
    • 参数采用值传递方式
  2. 用const修饰函数的返回值
    • 返回值为指针传递方式的情况
    • 返回值为值传递方式的情况

总结

前言

当我们提到const时,通常会想到它作为常量的用途。然而,实际上它的最大魅力在于可以修饰函数的参数和返回值。在本文中,我将为您揭开关于const的一些秘密。

一. 用const修饰函数的参数

  1. 如果参数是输出类型,不论采用何种传递方式,都无法用const修饰,否则参数将失去输出功能。const仅适用于输入参数。

    如果输入参数采用“指针传递”的方式,那么在参数上加const修饰可以防止意外地改动指针指向的内存单元,从而起到保护作用。

    void someFunction(const int *source, int *destination) {
         
        // 使用const修饰的source指针,不能通过source指针改变内容
        // destination指针没有const修饰,可以改变指向的内存内容
    }
    
  2. 如果还想保护指针本身,还可以声明指针本身为常量,防止该指针的值被改变。

    void test3() {
         
        int n = 10;
        int m = 20;
        int *const p = &n; // p是一个常量指针,不能改变其指向的地址
        *p = 20; // 可以通过p指针改变n的值
        p = &m; // 错误,不能改变常量指针的值
    }
    

二. 用const修饰函数的返回值

  1. 如果给以“指针传递”方式的函数返回值加const修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const修饰的同类型指针(除非强制转型)。

    const int* someFunction() {
         
        // ...
    }
    
    void test() {
         
        const int* ptr = someFunction(); // 合法,因为someFunction返回的指针是const int*
        *ptr = 10; // 错误,不能通过ptr来修改指向的内容
    }
    
  2. 如果函数采用“值传递”的方式,在一般情况下有余函数会把返回值拷贝到外部临时存储单元,所以加const修饰没意义。

    但当函数以值传递方式返回自定义的数据类型、返回引用或者返回指针时,有人会把函数当左值使用,为防止此种错误发生,可以使用const来修饰返回值。

请注意以上示例代码中的注释,它们解释了const在不同情况下的作用。在编写代码时,根据实际需要使用const来保护数据和指针的不可修改性,有助于提高代码的可靠性和可读性。

总结:

const关键字在C语言中用于指定变量或指针的不可修改性,可以应用于函数的参数和返回值。在本文中,我们讨论了const在函数参数和返回值中的使用。

在函数参数方面,我们了解到:

  • const不能用于输出类型的参数,因为它们需要能够在函数内部被修改以传递结果。
  • 对于采用指针传递方式的参数,可以使用const修饰来防止意外修改指针所指向的内存内容,从而提高代码的安全性。
  • 可以使用const修饰指针本身,将其声明为常量,从而保护指针本身的值不被修改。

在函数返回值方面,我们了解到:

  • 如果函数返回一个指针传递的值,并将其用const修饰,那么返回值(即指针)的内容不能被修改,只能赋给使用const修饰的同类型指针。
  • 对于采用值传递方式的函数返回值,一般情况下不需要使用const修饰,因为返回值会被拷贝到外部临时存储单元,不会影响原始值。

最后,使用const关键字可以增加代码的可靠性和可读性,防止意外的数据修改和指针误用。在编写函数时,根据函数的实际需求来合理地应用const修饰,有助于编写更安全和健壮的代码。​

相关文章
|
Android开发 芯片 异构计算
Android图形显示系统——下层显示4:图层合成下(硬件合成器)
硬件合成器-HwComposer 使用3D合成,需要大面积的像素混合计算和大量的内存传输(GPU读写GraphicBuffer所需),对GPU和DDR来说是一个巨大的负担。在GPU/DDR重度使用的场景(比如玩游戏),会造成发热、卡顿等。 为了提升性能,减少功耗,可以将合成这个过程交由另一个芯片完成,减轻GPU负担。进一步,直接让这个芯片连LCD,在LCD需要显示某一行时
6990 0
|
11月前
|
机器学习/深度学习 传感器 人工智能
智慧无人机AI算法方案
智慧无人机AI算法方案通过集成先进的AI技术和多传感器融合,实现了无人机的自主飞行、智能避障、高效数据处理及多机协同作业,显著提升了无人机在复杂环境下的作业能力和安全性。该方案广泛应用于航拍测绘、巡检监测、应急救援和物流配送等领域,能够有效降低人工成本,提高任务执行效率和数据处理速度。
649 2
智慧无人机AI算法方案
|
12月前
如何实现图片垂直旋转90度的问题
如何实现图片垂直旋转90度的问题
78 2
阿里云域名注册流程(图文教程很详细)
阿里云域名注册流程,包括阿里云账号注册、阿里云账号实名认证,域名信息模板实名认证、域名名称及后缀选择、域名优惠口令、域名代金券使用详细教程。
4570 0
阿里云域名注册流程(图文教程很详细)
|
消息中间件 算法 安全
开发者最怕遇到的代码报错
作为一名开发者,遇到代码报错是再平常不过的事情了。无论是在编写新代码还是修改现有代码时,都有可能出现各种各样的错误。有些错误可能只是简单的语法错误,而有些错误可能会导致整个程序无法正常运行。另外,结合阅读《实战总结|记一次消息队列堆积的问题排查》这篇文章,作者在工作中遇到的消息队列堆积的问题以及如何解决这一问题的过程,我深刻认识到了在开发过程中遇到问题准确排查的重要性,以及解决问题的策略和方法。那么接下来,就来聊一聊开发者最怕遇到的代码报错,以及如何有效地解决和避免这些问题。
611 2
开发者最怕遇到的代码报错
|
前端开发
安装R包出现rdb is corrupt报错
安装R包出现rdb is corrupt报错
|
SQL 存储 缓存
关于RDBMS和非RDBMS【数据库系统】
关于RDBMS和非RDBMS【数据库系统】
248 0
|
API 图形学 Python
【Unity使用UGUI实现王者荣耀UI界面(三)】登录界面以及加载界面优化
【Unity使用UGUI实现王者荣耀UI界面(三)】登录界面以及加载界面优化
484 0
【Unity使用UGUI实现王者荣耀UI界面(三)】登录界面以及加载界面优化
|
消息中间件 存储 缓存
(二)OpenStack---M版---双节点搭建---数据库安装和配置
(二)OpenStack---M版---双节点搭建---数据库安装和配置
361 0
(二)OpenStack---M版---双节点搭建---数据库安装和配置
|
应用服务中间件 安全
tomcat实现多端口、多域名访问
tomcat可以实现:多个端口访问同一个web应用、不同的应用通过不同的域名进行访问。 本文介绍的都是只启动一个tomcat服务的情况下,当然,实现这些功能也可以通过启动多个tomcat服务实现。
2606 0