您当前的位置:五五电子网电子知识单片机-工控设备51单片机C51学习心得体会,const限定符应用 正文
C51学习心得体会,const限定符应用

C51学习心得体会,const限定符应用

点击数:7490 次   录入时间:03-04 11:58:51   整理:http://www.55dianzi.com   51单片机
const限定符把一个对象转换成一个常量,如 const int bufSize=512; 申明bufSize的时候,如果不将它初始化,那么编译器会报错:const object must be initialized if not extern。因为bufSize被const限定符限制,如果不在申明bufSize的时候给它赋值,就不能再给它赋值(因为常量在定义之后就不能被修改),它就没有任何意义了。
下面将详细的讨论一下const变量的作用域、const指针、指向const对象的指针、const引用的相关用法。

1.const变量作用域
在全局作用域声明的普通全局变量在整个程序中都可以被访问,如:


++

但是在全局作用域声明的const变量却是定义该对象文件的局部变量,此变量只存在与这个文件中,不能被其他文件访问,有些类似于使用statIC修饰的全局变量。但是如果在其前面再加上extern,那么就意味着可以在其他文件中共享。如:



++

(const变量在默认的情况下是定义该变量文件的局部变量,之所以要这样定于语法,是因为允许const变量出现在头文件中,当一个头文件中定义了一个const变量,而它又是局部变量,那么在任何一个包含这个头文件的源文件都会有属于自己的const变量。而一般的非const变量则被默认为extern)

2.const指针
与任何const变量一样,const指针必须在定义的时候初始化。const指针即被const限定符修饰的指针,意味着它只能指向初始化时所指向的值,初始化之后就不能改变它的指向。如:


const指针只能限制指针本身是const类型,不能限制它所指向对象的值是否被改变,也不能限制通过这个指针改变它所指向对象的值。

3.指向const对象的指针
直接先看例子吧:


*

指向const对象的指针表示了一种特殊的限制:不能通过这个指针改变所指对象的值。看清楚哦,仅仅是不能通过指针改变其对象,绝对不代表其对象不能被改变,也不代表这个指针不能指向别的对象。“其对象能否被改变”,得由其对象自己的类型所决定;而“这个指针能不能指向别的对象”也是由这个指针的类型所决定(如果象2中那样定义这个指针,那么就成了const指针,也就不能指向别的对象了)。
虽然我们不能通过这个指针改变所指的对象的值,但是可以通过别的指针来改变,如:(接着上面的例子)



*

这个时候虽然pd还是指向的p,但是p的值已经由原来的3.14变成4.13了。

看到这里,相信读者应该很明白了吧。const对象、const指针、指向const对象的指针,这三者是相互不影响、不限制的关系,可以任意搭配。在这里举个将三者都搭配起来的例子,谁都不能被改变了:


其实是这样的:我们在定义普通的const对象的时候,合理的定义应该是:string const s=”abc”;const在类型的后面,从右向左阅读该声明语句会发现const直接修饰的是“s变量”,例如:



但是很多人阅读c++程序的时候,习惯将const类型放在前面,所以为了方面起见,规定将const放在类型前面或者后面都是符合语法的。

const ps cps; 等价于: ps const cps; 等价于: string * const cps; 即:cps是const指针。 ^_^

有关这个知识点,最后做两点说明:
1).const位置问题:

const Type variable-name 和 Type const variable-name(更加符合标准)是一回事,都表示申明一个const对象,也就是说,这个变量在后续程序中是不能被修改的。这里的Type可以是char、int、long等等。

char constch=’a';等价于: const charch=’a';
而对于指针变量或者变量的引用则有所不同:

char *constch=’a'; 不等价于: const char *ch=’a';



2).const变量赋值问题:
权限是允许缩小,但是不允许私自扩大。非const对象指针不能指向const对象,const对象指针可以指向非const变量。如:




4.const引用
当一个子函数需要使用主函数中某个变量的值时,我们可以用const引用的方式传递给子函数。用这种的好处在于:1)不用再为子函数分配内存来保存主函数中这个变量的副本(因为引用表示使用别名,而不是使用副本);2)防止子函数中无意识的改变了此变量的值。我们举例子说明,如:






5.const定义数组维数

数组的维数必须用大于等于1的常量表达式定义,此常量表达式只能包含整形字面值常量、枚举常量或者用常量表达式初始化的整形const对象,非const对象以及要到运行时阶段才知道其值的cosnt变量都不能用于定义数组的维数。一下分别举例说明:





本文关键字:学习心得  51单片机单片机-工控设备 - 51单片机