C深入const作用

来源:互联网 发布:农村淘宝合伙人的未来 编辑:程序博客网 时间:2024/05/22 00:42

关键字const用来定义常量,如果一个变量被const修饰,那么它的值就不能再被改变,我想一定有人有这样的疑问,C语言中不是有#define吗,干嘛还要用const呢,我想事物的存在一定有它自己的道理,所以说const的存在一定有它的合理性,与预编译指令相比,const修饰符有以下的优点:

1、预编译指令只是对值进行简单的替换,不能进行类型检查

2、可以保护被修饰的东西,防止意外修改,增强程序的健壮性

3、编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

下面我们从几个方面来说一下const的用法:

一、修饰局部变量

①、const修饰的变量不能改变

const int n=5;int const n=5;

这两种写法是一样的,都是表示变量n的值不能被改变了,需要注意的是,用const修饰变量时,一定要给变脸初始化,否则之后就不能再进行赋值了。

n=6;

就像这样,改变n的值会报错!

②、指针来改变const的值!!!

const int a = 10;int *p=&a;*p = 100;

这样运行没问题!
a虽然是const修饰,但是仅仅对于a是不可改变,我们可以通过p指针来间接改变a的值。

③、接下来看看const用于修饰常量静态字符串,例如:

const char* str="fdsafdsa";

如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。*有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。


二、常量指针与指针常量

常量指针是指针指向的内容是常量,可以有一下两种定义方式。

const int * n;int const * n;

1、常量指针

const int* n;

const 在*星号的前面,我们称为常量指针。常量指针说的是不能通过这个指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。

int a=5;const int* n;//不用开始就初始化int n=&a; 

那么

a+=8; //是合法的。*a=3; //显然,是非法的,p指向的数据是常量。

常量指针指向的值不能改变,但是指针本身可以改变!!

2、指针常量:

int *const n;

const 在*星号的后面,我们称为指针常量。需要注意的是,指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向改地址的指针来修改。

int a=5;int* const n=&a;
n+=8; //非法,a是指针常量,不可以改变。*n=3; //合法,a是指针的值是可以改变的。

3、指向常量的常指针

const int* const p;

是以上两种的结合,指针指向的位置不能改变并且也不能通过这个指针改变变量的值,但是依然可以通过其他的普通指针改变变量的值。

p+=8; //非法*p=3; //非法

三、修饰函数的参数

根据常量指针与指针常量,const修饰函数的参数也是分为三种情况

1、防止修改指针指向的内容

void StringCopy(char *strDestination, const char *strSource);

其中 strSource 是输入参数,strDestination 是输出参数。给 strSource 加上 const 修饰后,如果函数体内的语句试图改动 strSource 的内容,编译器将指出错误。

2、防止修改指针指向的地址

void swap ( int * const p1 , int * const p2 )

指针p1和指针p2指向的地址都不能修改。

3、以上两种的结合。


四、修饰函数的返回值

如果给以“指针传递”方式的函数返回值加 const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
例如函数

const char * GetString(void);

如下语句将出现编译错误:

char *str = GetString();

正确的用法是

const char *str = GetString();

五、修饰全局变量

全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,以为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变

转载修改:http://blog.csdn.net/xingjiarong/article/details/47282255

原创粉丝点击