C语言关键字const用法
c语言中的const">C语言中的const
const是C语言中保留的一个关键字,用来定义常量,如果一个变量被const修饰,那么它的值就不能被改变。使用符号常量写出的代码更容易维护;一些指针常常是边读边移动,而不是边写边移动;许多编程规范对于函数参数会强制要求只读不写,在这些情况下,都需要借助const实现。
那么有些人会问,C语言中不是已经存在#define了吗,为什么还要使用const呢?相比于#define,const修饰符有如下优势:
1. const能够使编译器进行类型检查,而预编译指令#define只是简单的对值进行替换。
2. const可以保护被修饰的变量等,防止变量因为意外被修改,从而增强程序的健壮性。
3. 编译器通常不为普通const常量分配存储空间,而是将他们保存在符号表中,这使得它成为了一个编译期间的常量,没有了存储于内存操作,使得它的效率很高。
const用法
const最常见的用法就是作为数组的边界和switch分情况标号,分类如下:
常变量: const + 类型说明符 + 变量名
常引用: const + 类型说明符 + &引用名
常对象:类名 + const 对象名
常成员函数:类名::fun(形参) + const
常数组:类型说明符 + const 数组名[大小]
常量指针: const + 类型说明符* 指针名或者类型说明符 + const *指针名
首先提示的是:在常变量(const + 类型说明符 + 变量名)、常引用(const + 类型说明符 + &引用名)、常对象(类名 + const 对象名)、常数组
(类型说明符 + const 数组名[大小]), con st”与“类型说明符”或“类名”(其实类名是一种自定义的类型说明符)的位置可以互换。如:
1
2
const
int
a=
5
;
int
const
a=
5
;
//等同
其实这种可以很好理解,const只能修饰int(类型名或类名),所以二
者是等同的。
修饰局部变量
1
2
const
int
n=
5
;
int
const
n=
5
;
这两种写法是一样的,都是表示变量n的值不能被改变了,需要注意的
是,用const修饰变量时,一定要给变量初始化(用来修饰函数的形参除外),否则之后就不能再进行赋值了。C语言中,const定义的常量是全局的,C++中则是视声明位置而定。
接下来看看const用于修饰常量静态字符串,例如:
1
const
char
* str =
"fdsafdsa"
;
如果没有const的修饰,我们可能会在后面有意无意的写str[4]=’x’
这样的语句,这样会导致对只读内存区域的赋值,然后程序会立刻异常终止。有了const,这个错误就能在程序被编译的时候就立即检查出来,这就是const的好处。让逻辑错误在编译期被发现。
常量指针与指针常量
常量指针
常量指针表示一个指向常量的指针,即该指针指向的内容是个常量(至少该常量指针是这样认为的),可以有如下的定义方式:
1
2
const
int
* n;
int
const
* n;
需要注意以下两点:
1.常量指针指向的值是不能改变的,但是这不意味指针本身不能改变,常
量指针是可以指向其他的地址的。
1 int a= 5 ;
2
3
4
5
int
b=
6
;
const
int
* n = &a;
int
const
*n1 = &a;
n=&b;
这个例子中,n和n1是等价的,都是指向a的一个常量指针,这时候有
人会说,常量指针指向的应该是一个常量吧,但是a并不是一个常量啊,为什么常量指针依旧可以指向a呢,这时候又要注意一下了:
编译器允许把非 const 对象的地址赋给指向 const 对象的指针,不允许把一个 const 对象的地址赋给一个普通的、非 const 对象的指针。
其实这个也很好理解,对于一个变量,我可以对你增加束缚,用指向const对象的指针指向你,这只是意味着我现在认为你是常量,不能通过这个常量指针对你进行修改,但是对于第二种情况就不一样了,你本来是一个被束缚的常量,如果用一个普通的指针指向你的话,就意味着我认为你这个常量是一个变量,这样或许我会在下面的代码中,对你的值进行修改,对一个const常量进行修改,会发生什么,你应该明白。
然后回到上面的`代码,我们将a的地址给了n,然后在下一行又改变了n 的值,将b的地址赋给了n,这是没有任何问题的,因为n只是一个指针,指向了一个常量,所以被称为常量指针,它本身依旧是一个
普通的指针,比较特殊的是它所指向的内容,而不是它本身。所以它本身的值可以修改,指向不同的内容。
2.当常量指针指向了一个变量时,不能通过这个常量指针改变变量的值,但是还是可以通过其他的引用来改变变量的值的。
1
2
3
4
5
6
int
a=
5
;
const
int
* n=&a;
a=
6
;
// 正确
*n =
7
;
//错误,对于常量指针,不能通过该指针来改变所指向的并不是一个常量)。
int
*ni = (
int
*)n;
*n =
100
;
//正确
在n这个指针眼中,n所指向的内容是一个常量,所以不允许别人通过n 本身对a进行修改,但是a本质上是一个变量,所以我们可以直接通过变量名或者新的普通指针对a进行修改。实际上,在将程序载入
内存的时候,会有专门的一块内存区域来存放常量。但是,上面的a本身不是常量,是存放在栈或者堆中的。我们仍然可以修改它的值。而n不能修改指向的值应该说是编译器的一个限制。
指针常量
switch的用法c语言
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论