《c语言const的用法.docx》由会员分享,可在线阅读,更多相关《c语言const的用法.docx(10页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、c语言const的用法c语言const的用法const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上能够提高程序的安全性和可靠性,另外,在观看别人代码的时候,明晰理解const所起的作用,对理解对方的程序也有一些帮助。下面我就跟大家介绍下c语言const的用法。我们来分情况看语法上它该怎样被使用。1、函数体内修饰局部变量。例:voidfunc()constinta=0;首先,我们先把const这个单词忽略不看,那么a是一个int类型的局部自动变量,我们给它赋予初始值0。然后再看const.const作为一个类型限定词,和int有一样的地位。constinta;in
2、tconsta;是等价的。于是此处我们一定要明晰的明白,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;其实等价于c
3、onstint(*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还有一个作用就是用于修饰常量静态字符
4、串。例如:constchar*name=David假如没有const,我们可能会在后面有意无意的写name4=x这样的语句,这样会导致对只读内存区域的赋值,然后程序会立即异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。const还能够用来修饰数组constchars=David与上面有类似的作用。2、在函数声明时修饰参数来看实际中的一个例子。NAMEmemmove-copybytestringLIBRARYStandardCLibrary(libc,-lc)SYNOPSIS#includestring.hvoid*mem
5、move(void*dst,constvoid*src,size_tlen);这是标准库中的一个函数,用于按字节方式复制字符串(内存)。它的第一个参数,是将字符串复制到哪里去(dest),是目的地,这段内存区域必须是可写。它的第二个参数,是要将什么样的字符串复制出去,我们对这段内存区域只做读取,不写。于是,我们站在这个函数本人的角度来看,src这个指针,它所指向的内存内所存储的数据在整个函数执行的经过中是不变。于是src所指向的内容是常量。于是就需要用const修饰。例如,我们这里这样使用它。constchar*s=hellocharbuf100;memmove(buf,s,6);/这里其实应
6、该用strcpy或memcpy更好假如我们反过来写,memmove(s,buf,6);那么编译器一定会报错。事实是我们经常会把各种函数的参数顺序写反。事实是编译器在此时帮了我们大忙。假如编译器静悄悄的不报错,(在函数声明处去掉const即可),那么这个程序在运行的时候一定会崩溃。这里还要讲明的一点是在函数参数声明中const一般用来声明指针而不是变量本身。例如,上面的size_tlen,在函数实现的时候能够完全不用更改len的值,那么能否应该把len也声明为常量呢?能够,能够这么做。我们来分析这么做有什么优劣。假如加了const,那么对于这个函数的实现者,能够防止他在实现这个函数的时候修改不需
7、要修改的值(len),这样很好。但是对于这个函数的使用者,1。这个修饰符号毫无意义,我们能够传递一个常量整数或者一个非常量整数过去,反正对方获得的只是我们传递的一个copy。2。暴露了实现。我不需要知道你在实现这个函数的时候能否修改正len的值。所以,const一般只用来修饰指针。再看一个复杂的例子intexecv(constchar*path,char*constargv);着重看后面这个,argv.它代表什么。假如去掉const,我们能够看出char*argv;argv是一个数组,它的每个元素都是char*类型的指针。假如加上const.那么const修饰的是谁呢?他修饰的是一个数组,ar
8、gv,意思就是讲这个数组的元素是只读的。那么数组的元素的是什么类型呢?是char*类型的指针.也就是讲指针是常量,而它指向的数据不是。于是argv1=NULL;/非法argv00=a/合法3、全局变量。我们的原则仍然是,尽可能少的使用全局变量。我们的第二条规则则是,尽可能多的使用const。假如一个全局变量只在本文件中使用,那么用法和前面所讲的函数局部变量没有什么区别。假如它要在多个文件间分享,那么就牵扯到一个存储类型的问题。有两种方式。1.使用extern例如externconstdoublepi;constdoublepi=3.14;然后其他需要使用pi这个变量的,包含file1.h#in
9、cludefile1.h或者,本人把那句声明复制一遍就好。这样做的结果是,整个程序链接完后,所有需要使用pi这个变量的分享一个存储区域。2.使用static,静态外部存储类staticconstpi=3.14;需要使用这个变量的*.c文件中,必须包含这个头文件。前面的static一定不能少。否则链接的时候会报告讲该变量被屡次定义。这样做的结果是,每个包含了constant.h的*.c文件,都有一份该变量本人的copy,该变量实际上还是被定义了屡次,占用了多个存储空间,不过在加了static关键字后,解决了文件间重定义的冲突。坏处是浪费了存储空间,导致链接完后的可执行文件变大。但是通常,这个,小
10、小几字节的变化,不是问题。好处是,你不用关心这个变量是在哪个文件中被初始化的。最后,讲讲const的作用。const的好处,是引入了常量的概念,让我们不要去修改不该修改的内存。直接的作用就是让更多的逻辑错误在编译期被发现。所以我们要尽可能的多使用const。但是很多人并不习惯使用它,更有甚者,是在整个程序编写/调试完后才补const。假如是给函数的声明补const,尚好。假如是给全局/局部变量补const,那么那么,为时已晚,无非是让代码看起来更漂亮了。c语言const的用法const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上能够提高程序的安全性和可靠性,另外,在观看别人代码的时候,明晰理解const所起的作用,对理解对方的程序也有一些帮助。下面我就跟大家介绍下c语言cons推荐度: