C中的CONST使用

const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的安全性和可靠性。

const的使用是c语言中一个比较微妙的地方,请看下面几个问题。

问题:const变量 和 常量

  为什么下面的例子在使用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢? 

  const int n = 5;

int a[n];

答案与分析:

1)这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为常量是被编译器放在内存中的只读区域,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。

C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时长度必须是“常量”,“只读变量”也是不可以的。

  2) 注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它。

3) 那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型#define宏,这两个都可以用来定义常量。

问题:const变量 和 const 限定的内容

  下面的代码编译器会报一个错误,请问,哪一个语句是错误的呢? 

  typedef char * pStr;

  char string[4] = "abc";

  const char *p1 = string;

  const pStr p2 = string;

  p1++;

  p2++;

  答案与分析:

  问题出在p2++上。

  1) const使用的基本形式: const char m;

  限定m不可变。

  2) 替换1式中的m, const char *pm;

  限定*pm不可变,当然pm是可变的,因此问题中p1++是对的。

  3) 替换1式char, const newType m;

  限定m不可变,问题中的charptr就是一种新类型,因此问题中p2不可变,p2++是错误的。

问题:const变量 和 字符串常量

  请问下面的代码有什么问题?

  char *p = "i'm hungry!";

  p[0]= 'I';

  答案与分析:

  上面的代码可能会造成内存的非法写操作。分析如下, “i'm hungry”实质上是字符串常量,而常量往往被编译器放在只读的内存区,不可写。p初始指向这个只读的内存区,而p[0] = 'I'则企图去写这个地方,编译器当然不会答应。

问题:const变量 和 字符串常量2

  请问char a[3] = "abc" 合法吗?使用它有什么隐患?

  答案与分析:

在标准C中这是合法的,但是它的生存环境非常狭小;它定义一个大小为3的数组,初始化为“abc”,但它没有通常的字符串终止符'\0',因此这个数组只是看起来像C语言中的字符串,实质上却不是,因此所有对字符串进行处理的函数,比如strcpy、printf等,都不能够被使用在这个假字符串上。

问题5:const 和 指针

类型声明中const用来修饰一个常量,有如下两种写法,那么,请问,下面分别用const限定不可变的内容是什么?

1) const在前面

  const int nValue; //nValue是const

  const char *pContent; //*pContent是const, pContent可变

  const (char *) pContent; //pContent是const,*pContent可变

  char* const pContent; //pContent是const,*pContent可变

const char* const pContent; //pContent和*pContent都是const

2) const在后面,与上面的声明对等

  int const nValue; // nValue是const

  char const * pContent;// *pContent是const, pContent可变

  (char *) const pContent;//pContent是const, *pContent可变

  char* const pContent;// pContent是const, *pContent可变

char const* const pContent;// pContent和*pContent都是const

答案与分析:

const和指针一起使用是C语言中一个很常见的困惑之处,在实际开发中,特别是在看别人代码的时候,常常会因为这样而不好判断作者的意图,下面介绍一种有效的判断原则:

A、  当有“()”的出现时,比如

const (char *) pContent;

此时,(char *)是一个整体,相当于一个新类型,因此,这时限定指针为const。

B、其它情况时

l          沿着*号划一条线,如果const位于*的左侧,则const就是用来修饰指针所指向的变量,即指针所指的为常量

l          如果const位于*的右侧,const就是修饰指针本身,即指针本身是常量。

C语言中的CONST使用相关推荐

  1. c语言常量的正确表示const,C语言中的const和free用法详解

    注意:C语言中的const和C++中的const是有区别的,而且在使用VS编译测试的时候.如果是C的话,请一定要建立一个后缀为C的文件,不要是CPP的文件.因为,两个编译器会有差别的. 一.C语言中的 ...

  2. 以下关于c语言中static和const,c语言中static const作用

    c语言中static const作用 (2012-06-21 07:51:08) 标签: it 关键字static: 1. 在函数体内,一个被声明为静态的变量在这一个函数被调用的过程中维持其值不变. ...

  3. C语言中的const,volatile与restrict的使用

    1. const 变量声明中带有关键词const,意味着不能通过赋值,增量或减量来修改该变量的值,这是显而易见的一点.指针使用const则要稍微复杂点,因为不得不把让指针本身成为const和指针指向的 ...

  4. C语言中的const

    C语言的中的const,代表的含义是"不可改变的变量",或者可以成为"伪常量" C++中 const,被称为"一个有类型描述的常量" con ...

  5. 【C语言进阶深度学习记录】九 C语言中const的详细分析

    文章目录 1 const的分析 2 const本质的分析实验 2.1 代码案例分析 3 const修饰函数参数和返回值时的情况 3.1 代码案例分析 4 总结 1 const的分析 不管是C语言还是C ...

  6. 在单片机C语言中const是什么意思

    在单片机C语言中const unsigned char ov529[5]={0xff,0xff,0xff,SYNC_ID,0x00}前面加const是什么意思?? 表示常量,不允许修改里面的内容.也就 ...

  7. const 作用 c语言,在C语言中const 作用的的全面总结.doc

    右面拒账则川盾衡徊洁豁却尤骂登硫矢窍松寝春摘慌瘪悯嚏蓑篓雍淫东佳粮瘤遍榜柔脾右晕沮椒肃蛾闲惹戚谩智胜汁秀玉怠继纺侥圃唯需齿翟顿稽吩餐音欧宪撅虐镁级脖铲贵酋挚昂藕瓢需冷乃依萎听滚俄郭奴痈急欲沾挂畅好姐载 ...

  8. C语言中const的用法

    C语言中const的用法 基本解释         const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解co ...

  9. const在c语言中作用,在C语言中const作用全面总结.doc

    在C语言中const作用全面总结 C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助.Const 是C++中常 ...

最新文章

  1. oracle常用sql命令
  2. 引用Drawable颜色常数及背景色
  3. 【BCVP升级】泛型主键的使用
  4. 中有atoi函数吗_C++ 多态的实现及原理,深挖vptr指针,手动调用虚函数
  5. 计算机科学与因果关系,计算机科学与技术
  6. idea报“Usage of API documented as @since 1.7”这一问题的解决方法
  7. dorado7.x form提交数据报错
  8. 窗内网所有编程类视频大集合
  9. [IT名人堂]《人件》作者:汤姆.迪马可
  10. mac键盘快捷键详解,苹果电脑键盘快捷键图文教程
  11. Alexa, Stop Spying on Me!“: Speech Privacy Protection Against Voice Assistants
  12. Android , 打开系统播放器
  13. 华为荣耀路由器虚拟服务器,荣耀路由器怎么设置?
  14. COBIT(cobit框架)
  15. EFR32上实现精确的软件延时
  16. python数据抓取工具_【重磅开源】Hawk-数据抓取工具:简明教程
  17. TCP/IP 模型与 OSI 模型对比
  18. css direction属性
  19. 诺基亚“东山再起”业务重组 全球裁员引关注
  20. Fluent的VOF模型中明渠流动的设置(1)

热门文章

  1. 删除顺序表中所有的的重复数据
  2. 使用Python,Opencv进行二维直方图的计算及绘制
  3. Numpy数组图像基本操作方法,及截取ROI、增加行与列
  4. 第一章:点云中的滤波问题---Filters
  5. 开发者如何构建技术影响力
  6. 奇葩错误:不同变量名称相同
  7. java c 解决方案_Java jdk安装及javac命令无效解决方案
  8. SC-A-LOAM:在A-LOAM中加入回环检测
  9. 【冷知识】获取网页所有的监听事件类型、方法。请认准getEventListeners
  10. 在CentOS 7.7 x86_64上安装python3.7.7