在C语言程序中,const关键字也是经常会用到的一个关键字,那么使用const关键字的目的是什么呢?事实上,在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图。

  事实上,无论我们是使用const关键字声明变量还是声明参数,其目的都是为了告诉使用者这个变量或者参数的应用目的。合理地使用关键字const 可以使编译器有效地保护那些不希望被改变的变量或参数,防止其无意中被代码修改。所以使用const关键字可以避免一些不必要的错误。

  我们已经说明了const关键字的作用,接下来我们将更进一步讨论const关键字使用:

1const关键字修饰的变量

   const关键字最常见的用法就是修饰变量,使用const关键字修饰的变量可以认为有只读属性。如:

  const int a=10;

  int b=0;

  b=a;  (I)这条语句是正确的

  a=b;  (II)这条语句是错误的,编译错误,因为a具有只读属性

  虽然const关键字修饰的变量具有只读属性,但绝不能将它简单的等价于常量。事实上C语言的const关键字修饰的变量仅是语法上的常量。

  此外,使用const关键字修饰的变量,在声明时必须进行初始化。这是显而易见的,既然是只读的,当然就得有一可供兑取的明确的值,而不是不确定的。例如:

  const int a=10;    //合法用法

  const int a;      //非法,导致编译错误

  另外需要注意的是,使用const关键字定义的变量是全局性的。所以在使用的时候需要注意。

  通常使用define定义一个宏,如:#define PI 3.1415976,以后无论在哪里需要使用圆周率时,我们直接使用PI即可,而在编译时预处理器会将所有的PI替换为3.1415976。这很方便,但是由于编译器不会对其进行检查,如果使用不慎就会引入错误,而且此种错误很难发现。而且,我们也无法得到PI的地址,不能向PI传递指针或引用。

  为此,我们常使用const关键字修饰的变量来代替宏。使用const声明的变量虽然增加了分配空间,但是可以保证类型安全,并且可以得到其指针。const消除了预处理器的值替代的不良影响,并且提供了良好的类型检查形式和安全性,所以理解了const关键字,对我们的编程是有很大的帮助的。

2const关键字修饰的指针变量

  const关键字除了用来修饰普通变量外,还经常用来修饰指针变量。当然,在讨论之前,我们需要搞清楚两个概念:常量指针和指向常量的指针。所谓常量指针就是指针变量的值一旦初始化就不能改变,所以必须初始化。而所谓指向常量的指针就是其指向的值是一个常量的指针。

  在声明指针变量时,const关键字所处的位置,决定了其定义的指针变量的含义,例如我们定义:

  (a)int * const p; 该语句表示指向整形的常量指针 ,它不能在指向别的变量,但指向(变量)的值可以修改。

  (b)const int * p; 该语句表示指向整形常量 的指针,它指向的值不能修改。

  (c)int const * p; 该语句与b的含义相同,表示指向整形常量 的指针,它指向的值不能修改。

  (d)const int *const p; 该语句表示指向整形常量 的常量指针 。它既不能再指向别的常量,指向的值也不能修改。

  (e)int const *const p; 该语句与d的含义相同,表示指向整形常量 的常量指针 。它既不能再指向别的常量,指向的值也不能修改。

  这写定义容易让人糊涂,但有一点技巧可以帮助我们理解。就是看const关键字的右边跟着的是什么?当const关键字的右边是类型时,则表示值是常量;当const关键字的右边是指针变量,则表示指针本身是常量。

3const关键字修饰的函数形参

  const关键字也经常用来修饰函数的形参。关键字const修饰函数形参时,通常用于参数为指针或引用的情况,且只能修饰输入参数。若输入参数采用“值传递”方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。

  const关键字修饰函数输入参数的形式如:void function(const  int * a ); 或者void function(const  int & a);都是可以的。在C标准库中就很多这样的应用,例如字符串处理函数:

  字符串拷贝函数:char *strcpychar *strDestconst char *strSrc);

  返回字符串长度函数:int strlenconst char *str);

  以上两个函数就是将源字符串使用const关键字保护起来,防止不注意的修改改变了源字符串的值。

  佷显然,采用const关键字修饰函数形参,就是为了保护输入参数。在调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const int * a,则不能对传递进来的指针所指向的内容进行改变,保护了原指针所指向的内容;如形参为const int & a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。

4const关键字修饰的函数返回值

  const关键字有时候也会用来修饰函数的返回值,这种情况一般是用来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改。例如:

  const char * function(void);

  这种用法比较少见,在此仅提及一下。

  综上所述,const关键字不但强大,而且对我们的编程确实有很大的帮助,前提是我们真正的理解了它的用法。

欢迎关注:

转载于:https://www.cnblogs.com/foxclever/p/9826499.html

C语言学习及应用笔记之三:C语言const关键字及其使用相关推荐

  1. C++语言学习(十二)——C++语言常见函数调用约定

    C++语言学习(十二)--C++语言常见函数调用约定 一.C++语言函数调用约定简介 C /C++开发中,程序编译没有问题,但链接的时候报告函数不存在,或程序编译和链接都没有错误,但只要调用库中的函数 ...

  2. Python语言学习之图表可视化:python语言中可视化工具包的简介、安装、使用方法、经典案例之详细攻略

    Python语言学习之图表可视化:python语言中可视化工具包的简介.安装.使用方法.经典案例之详细攻略 目录 python语言中可视化工具包的简介 python语言中可视化工具包的安装 pytho ...

  3. C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符

    C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 目录 C语言学习(十二)C语言中的字符(宽字符与窄字符).从字符谈谈C语言的编码.转义字符 英文字符 字符的表示 ...

  4. C语言学习及应用笔记之一:C运算符优先级及使用问题

    C语言中的运算符绝对是C语言学习和使用的一个难点,因为在2011版的标准中,C语言的运算符的数量超过40个,甚至比关键字的数量还要多.这些运算符有单目运算符.双目运算符以及三目运算符,又涉及到左结合和 ...

  5. c语言字 字符串转换成数组_C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include 总结 以上 ...

  6. go语言学习路线图_开篇:Go 语言的优势与学习路线图

    开篇:Go 语言的优势与学习路线图 由 学院君 创建于1年前, 最后更新于 4个月前 版本号 #5 简介 Go 语言又称 Golang,由 Google 公司于 2009 年发布,近几年伴随着云计算. ...

  7. C语言学习教程之详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include <s ...

  8. go语言学习路线图_2019年最新Go语言学习路线图,三个月带你通关Go语言

    作者:郝林 内容选自:<Go语言核心36讲> 1. 明星大厂热推,岗位需求火热. 最近,Hacker News 发布了 2018 年编程语言的招聘趋势排行榜,其中,Go语言已经反超Java ...

  9. 两个变量实现查找坏环c语言,C/C++编程笔记:C语言编程知识要点总结!大一C语言知识点(全)...

    程序员无言 2020-07-07 一.C语言程序的构成 与C++.Java相比,C语言其实很简单,但却非常重要.因为它是C++.Java的基础.不把C语言基础打扎实,很难成为程序员高手. 1.C语言的 ...

最新文章

  1. 一行js代码识别Selenium+Webdriver及其应对方案
  2. 英伟达颠覆CPU!Arm架构专为AI而生,性能超x86十倍
  3. System.exit(0)和System.exit(1)区别
  4. Linux中mysql的操作
  5. 如何从Fiori launchpad发出的请求判断出后台是哪个网关系统在响应
  6. JavaFX UI控件教程(二十三)之Menu
  7. 计算机视觉,凉了?!
  8. 《从零开始学keras之神经风格迁移
  9. SQL Server 2005全文检索技术
  10. 简单易懂实例说明如何设计子网掩码
  11. WOW、ScrollReveal:WOW.js和ScrollReveal.js基础学习
  12. mac安装旺旺启动台找不到_如何正确安装和卸载Mac软件?
  13. html 组件化 编辑器,纯前端表格控件SpreadJS V14.0发布:组件化编辑器+数据透视表...
  14. linux xps文件,XPS 文件扩展名: 它是什么以及如何打开它?
  15. 机器人国际会议与期刊列表
  16. linux内核创建软链接过程,Linux内核2.4.18创建符号链接的系统调用sys_symlink分析
  17. 使用KMS激活软件导致浏览器呗篡改解决办法
  18. 浅聊前端程序员,后端程序员,全栈程序员的工作
  19. 干掉Session?这个跨域认证解决方案真的优雅
  20. 郭鹤年--亚洲糖王与酒店巨子

热门文章

  1. nagios系列(七)nagios通过自定义脚本的方式监控mysql主从同步
  2. protobuf-2.5.0安装
  3. ospf-cost-FR选路实验
  4. 史上最快消息内核——ZeroMQ
  5. 在IIS中寄存已有WCF服务
  6. 出远门需要检查的物件
  7. 银屑病与肠道菌群(调研手稿二)
  8. pom.xml中的artifactId是什么意思?
  9. 下采样downsample代码
  10. OpenCV学习笔记七-创建滑动条