C语言const详解

目录

一、什么是const

二、使用const的优点

三、const的用法

(1)修饰局部变量

(2)常量指针与指针常量

三、修饰函数的参数

(1)防止修改指针指向的内容

(2)防止修改指针所指向的地址

四、修饰函数的返回值

五、修饰全局变量

六、简单笔试题


一、什么是const

如果我们想定义这样一种变量,使它的值不能被改变,在整个作用域中都保持固定,那可以使用const关键字对变量加以限定。

不过要注意,被const所修饰的变量,其值是可以通过指针被修改的!

有一种说法是const定义的是变量为常变量。

被const修饰的是变量,而修饰之后又相当于常量,但还有变量的属性,所以叫常变量。

其用法非常简单,只需在定义变量时前加const即可。

const既可以加在变量前、类型后,又可以加在类型前。如:

const int i = 0;
int const a = 0;

这两者是等价的。

二、使用const的优点

1、预编译指令仅是对的简单替换,不能对类型进行检查,相比之下,被const修饰的变量有自己的类型;

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

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

4、可以进行类型检查

三、const的用法

(1)修饰局部变量

const char* str="fdsafdsa";

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

(2)常量指针与指针常量

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

const int* n;
int const* n;

可以发现,无论是在int前还是后,它们均位于*之前。

警告:

1.常量指针只是不能通过指针改变变量的值,还可以以其他方式来改变变量的值

int a=5;
const int* n=&a;
a=6;

2.指针本身可以被改变!常量指针可以指向其他的地址。

int a=5;
int b=6;
const int* n=&a;
n=&b;

3.指针常量是指指针本身是个常量,不能指向其他地址

int*const n;

4.指针常量指向的地址不能改变,但是地址中保存的数值是可以改变的,可以通过其他指向该地址的指针来修改。

int a=5;
int*p=&a;
int* const n=&a;
*p=8;

区分常量指针和指针常量的关键就在于*的位置,以*为分界线,如果const在星号的左边,则为常量指针,如果const在星号的右边则为指针常量。

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

const int* const p;

三、修饰函数的参数

(1)防止修改指针指向的内容

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

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

(2)防止修改指针所指向的地址

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

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

四、修饰函数的返回值

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

例如函数

const char* GetString(void);

用法是

const char*str = GetString();

五、修饰全局变量

全局变量的作用域是整个文件,我们应该尽量避免使用全局变量,因为一旦有一个函数改变了全局变量的值,它也会影响到其他引用这个变量的函数,导致除了bug后很难发现,如果一定要用全局变量,我们应该尽量的使用const修饰符进行修饰,这样方式不必要的以为修改,使用的方法与局部变量是相同的。

六、简单笔试题

有关const的面试题、笔试题太多了,很精彩,可以自行查找。这里仅用2015年360的笔试题讲解。

牛客网链接:语言中哪一种形式声明了一个指向char类型变量的指针p,p的__牛客网 (nowcoder.com)

语言中哪一种形式声明了一个指向char类型变量的指针p,p的值不可修改,但p指向的变量值可修改?

A.const char *p
B.char const *p
C.char*const p
D.const char *const p

【正确答案】C
【解析】const 限定一个数据为只读属性。
1.const char p; 限定变量 p 为只读。
2.const char *p; p 为一个指向 char 类型的指针,const 限定 p 指向的数据为只读。所以 *p 的值不能被修改,而指针变量 p 本身的值可以被修改。
3.char * const p; 限定此指针变量为只读,所以 p 的值不能被修改,而 *p 的值可以被修改。
4.const char *const p; 两者皆限定为只读,不能修改。

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值