C语言关键字const的使用_第1页
C语言关键字const的使用_第2页
C语言关键字const的使用_第3页
C语言关键字const的使用_第4页
C语言关键字const的使用_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本文格式为Word版,下载可任意编辑——C语言关键字const的使用C语言关键字const的使用

C语言是一门通用计算机编程语言,应用广泛。本文主要介绍C语言关键字const的相关内容。

const我们称之为常量修饰符,意即其所修饰的对象为常量immutable。

我们来分处境看语法上它该如何被使用。

1、函数体内修饰局部变量。

例:

voidfunc

constinta=0;

首先,我们先把const这个单词疏忽不看,那么a是一个int类型的局部自动变量,

我们给它赋予初始值0。

然后再看const.

const作为一个类型限定词,和int有一致的地位。

constinta;

intconsta;

是等价的。于是此处我们确定要明显的明白,const修饰的对象是谁,是a,和int没

有关系。const要求他所修饰的对象为常量,不成被变更,不成被赋值,不成作为左值l-value。

这样的写法也是错误的。

constinta;

a=0;

这是一个很常见的使用方式:

constdoublepi=3.14;

在程序的后面假设企图对pi再次赋值或者修改就会出错。

然后看一个稍微繁杂的例子。

constint*p;

还是先去掉const修饰符号。

留神,下面两个是等价的。

int*p;

int*p;

其实我们想要说的是,*p是int类型。那么鲜明,p就是指向int的指针。

同理

constint*p;

其实等价于

constint*p;

intconst*p;

即,*p是常量。也就是说,p指向的数据是常量。

于是

p+=8;//合法

*p=3;//非法,p指向的数据是常量。

那么如何声明一个自身是常量指针呢?方法是让const尽可能的靠近p;

int*constp;

const右面只有p,鲜明,它修饰的是p,说明p不成被更改。然后把const去掉,可以

看出p是一个指向int形式变量的指针。

于是

p+=8;//非法

*p=3;//合法

再看一个更繁杂的例子,它是上面二者的综合

constint*constp;

说明p自己是常量,且p指向的变量也是常量。

于是

p+=8;//非法

*p=3;//非法

const还有一个作用就是用于修饰常量静态字符串。

例如:

constchar*name=David;

假设没有const,我们可能会在后面有意无意的写name[4]=x这样的语句,这样会

导致对只读内存区域的赋值,然后程序会马上奇怪终止。有了const,这个错误就

能在程序被编译的时候就立刻检查出来,这就是const的好处。让规律错误在编译

期被察觉。

const还可以用来修饰数组

constchars[]=David;

与上面有类似的作用。

2、在函数声明时修饰参数

来看实际中的一个例子。

void*memmovevoid*dst,constvoid*src,size_tlen;

这是标准库中的一个函数,用于按字节方式复制字符串内存。

它的第一个参数,是将字符串复制到哪里去dest,是目的地,这段内存区域务必

是可写。

它的其次个参数,是要将什么样的字符串复制出去,我们对这段内存区域只做读

取,不写。

于是,我们站在这个函数自己的角度来看,src这个指针,它所指向的内存内所存

储的数据在整个函数执行的过程中是不变。于是src所指向的内容是常量。于是就

需要用const修饰。

例如,我们这里这样使用它。

constchar*s=hello;

charbuf[100];

memmovebuf,s,6;//这里其实理应用strcpy或memcpy更好

假设我们反过来写,

memmoves,buf,6;

那么编译器确定会报错。事实是我们经常会把各种函数的参数依次写反。事实是编

译器在此时帮了我们大忙。假设编译器静静静的.不报错,在函数声明处去掉

const即可,那么这个程序在运行的时候确定会崩溃。

这里还要说明的一点是在函数参数声明中const一般用来声明指针而不是变量本身。

例如,上面的size_tlen,在函数实现的时候可以完全不用更改len的值,那么是否

理应把len也声明为常量呢?可以,可以这么做。我们来分析这么做有什么优劣。

假设加了const,那么对于这个函数的实现者,可以防止他在实现这个函数的时候修

改不需要修改的值len,这样很好。

但是对于这个函数的使用者,

1。这个修饰符号毫无意义,我们可以传递一个常量整数或者一个分外量整数过

去,反正对方获得的只是我们传递的一个copy。

2。暴露了实现。我不需要知道你在实现这个函数的时候是否修更正len的值。

所以,const一般只用来修饰指针。

再看一个繁杂的例子

intexecvconstchar*path,char*constargv[];

着重看后面这个,argv.它代表什么。

假设去掉const,我们可以看出

char*argv[];

argv是一个数组,它的每个元素都是char*类型的指针。

假设加上const.那么const修饰的是谁呢?他修饰的是一个数组,argv[],意思就是

说这个数组的元素是只读的。那么数组的元素的是什么类型呢?是char*类型的指

针.也就是说指针是常量,而它指向的数据不是。

于是

argv[1]=NULL;//非法

argv[0][0]=a;//合法

3、全局变量。

我们的原那么照旧是,尽可能少的使用全局变量。

我们的其次条规矩那么是,尽可能多的使用const。

假设一个全局变量只在本文件中使用,那么用法和前面所说的函数局部变量没有什

么识别。

假设它要在多个文件间共享,那么就牵扯到一个存储类型的问题。

有两种方式。

1.使用extern

例如

/*file1.h*/

externconstdoublepi;

/*file1.c*/

constdoublepi=3.14;

然后其他需要使用pi这个变量的,包含file1.h

#includefile1.h

或者,自己把那句声明复制一遍就好。

这样做的结果是,整个程序链接完后,全体需要使用pi这个变量的共享一个存储区域。

结果,说说const的作用。

const的好处,是引入了常量的概念,让我们不要去修改不该修改的内存。直接的

作用就是让更多的规律错误在编译期被察觉。所以我们要尽可能的多使用const。

但是好多人并不习惯使用它,更有甚者,是在整个程序编写/调试完后才补

const。假设是给函数的声明补const,尚好。假设是给全局/局部变量补const,那

么……那么,为时已晚,无非是让代码看起来更美丽了。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论