在C语言程序中,const关键字也是经常会用到的一个关键字,那么使用const关键字的目的是什么呢?事实上,在程序中使用const关键字的主要目的就是为了向使用者传递设计者的一些意图。
事实上,无论我们是使用const关键字声明变量还是声明参数,其目的都是为了告诉使用者这个变量或者参数的应用目的。合理地使用关键字const 可以使编译器有效地保护那些不希望被改变的变量或参数,防止其无意中被代码修改。所以使用const关键字可以避免一些不必要的错误。
我们已经说明了const关键字的作用,接下来我们将更进一步讨论const关键字使用:
(1)const关键字修饰的变量
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关键字,对我们的编程是有很大的帮助的。
(2)const关键字修饰的指针变量
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关键字的右边是指针变量,则表示指针本身是常量。
(3)const关键字修饰的函数形参
const关键字也经常用来修饰函数的形参。关键字const修饰函数形参时,通常用于参数为指针或引用的情况,且只能修饰输入参数。若输入参数采用“值传递”方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。
const关键字修饰函数输入参数的形式如:void function(const int * a ); 或者void function(const int & a);都是可以的。在C标准库中就很多这样的应用,例如字符串处理函数:
字符串拷贝函数:char *strcpy(char *strDest,const char *strSrc);
返回字符串长度函数:int strlen(const char *str);
以上两个函数就是将源字符串使用const关键字保护起来,防止不注意的修改改变了源字符串的值。
佷显然,采用const关键字修饰函数形参,就是为了保护输入参数。在调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部分进行常量化,如形参为const int * a,则不能对传递进来的指针所指向的内容进行改变,保护了原指针所指向的内容;如形参为const int & a,则不能对传递进来的引用对象进行改变,保护了原对象的属性。
(4)const关键字修饰的函数返回值
const关键字有时候也会用来修饰函数的返回值,这种情况一般是用来修饰返回的指针或引用,保护指针指向的内容或引用的内容不被修改。例如:
const char * function(void);
这种用法比较少见,在此仅提及一下。
综上所述,const关键字不但强大,而且对我们的编程确实有很大的帮助,前提是我们真正的理解了它的用法。
欢迎关注: