c关键字const详解

最近被人问了个技术问题,感触很深,就是关于const关键字的基本用法判断,看到这个问题我其实挺开心的,因为去年我在书上记录过C 语言的几个常用关键字的基本用法,最近用的少了,都有点生疏遗忘了,技术就是一把容易生锈的dao,得经常磨磨才不怕问~~

1.const修饰变量

const 关键字用的比较多的用法就是修饰全局变量,是被修饰的变量不可更改,即只具有只读性;
两个注意点:
(1)被const关键字修饰的变量必须初始化,不可以是不确定的
如:

const int temp = 0; 	//正确用法
int count = 0;
count = temp ;		//正确用法,适合
temp = count ; 	//错误用法,temp值不可修改
const int temp;			//错误用法,会导致编译出错

(2)通常使用define定义一个宏,如:#define PI 3.1415976,以后无论在哪里需要使用圆周率时,我们直接使用PI即可,而在编译时预处理器会将所有的PI替换为3.1415976。这很方便,但是由于编译器不会对其进行检查,如果使用不慎就会引入错误,而且此种错误很难发现。而且,我们也无法得到PI的地址,不能向PI传递指针或引用。

为此,我们常使用const关键字修饰的变量来代替宏。使用const声明的变量虽然增加了分配空间,但是可以保证类型安全,并且可以得到其指针。const消除了预处理器的值替代的不良影响,并且提供了良好的类型检查形式和安全性,所以理解了const关键字,对我们的编程是有很大的帮助的。

2.const 关键字修饰指针变量

首先区分两个概念:
(1)常量指针:顾名思义,就是指针变量的值初始化以后相当于常量,不可修改;
(2)指针常量:指向常量的指针变量;

在声明指针变量时,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关键字不但强大,而且对我们的编程确实有很大的帮助,前提是我们真正的理解了它的用法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值