const修饰全局与局部
const在C和C++中
首先,我们来看如下程序:
1#include
2#include
3
4const int constSize = 5;
5int array[constSize] ={0};
6
7int main(int argc, char *argv[]) {
8
9 printf("Hello const\n");
10 return 0;
11}
假如把const修饰的名称视为常量,那么其作为数组大小设置应该能够通过编译才对,而在Dev下编译得到如下结果:
大体的意思是编译器认为你在修改这个数数组,也就是说constSize是一个变量,程序正在用一个变量访问一个数组,所以在C语言中const修饰的部分固定不变,但终究不是常量,而是一个只读变量。
而同样的程序在C++编译环境中是可以编译通过的,C++会编译优化认为其就是一个常量,所以可以用来初始化数组。当然,如果你看到有些编译器用变量作为了数组的初始化大小,那一般都是其扩展功能,这里就不展开描述了。
const修饰全局与局部
1#include
2#include
3
4const int constVar = 5;
5
6int main(int argc, char *argv[]) {
7
8 int *pVar = (int*)&constVar;
9 *pVar = 10;
10 printf("constVar = %d\n",constVar);
11 printf("Hello const\n");
12 return 0;
13}
1#include
2#include
3
4
5int main(int argc, char *argv[]) {
6 const int constVar = 5;
7 int *pVar = (int*)&constVar;
8
9 *pVar = 10;
10 printf("constVar = %d\n",constVar);
11 printf("Hello const\n");
12 return 0;
13}
const修饰指针的老问题
虽然这是一个老掉牙的问题,不过我还是想在这里谈谈自己的理解,对于const修饰指针定义,最终处理的办法是:去掉所有的类型,const右侧表示什么,什么就不能被直接修改,如下所示:
1const int const * const pVar = &Var1;
2const int * const pVar = &Var1;
3int const * const pVar = &Var1;
4
5//根据规则简化: const (* const (pVar)) --> *pVar和pVar均不可修改
以上三种方式均是等价的,啥也不能被修改,地址和数据都为只读,不管你在程序中采用*pVar作为左值还是pVar作为左值,编译器均会报错。
一旦你去掉其中一个const即可释放一种访问权限,比如:
1int * const pVar = &Var1; //可以访问*pVar,而修改pVar便会报错
2const int *pVar = &Var1; //可以访问pVar,而修改*pVar便会报错
大多数人估计研究到这里就截止了,其实以上仅仅只是一级指针,而对于多级指针又会有这样的实现技巧吗?
同样还是:“const右侧的标识什么,什么就不能被直接修改”,比如下面:
1const int * const * const pVar = 0xxxxxxxx; //全都不能修改
2 int * const * const pVar = 0xxxxxxxx; //仅**pVar能够修改
3const int * * const pVar = 0xxxxxxxx; //仅*pVar能够修改
const的应用
1int sMempy(const int * pSrc, int * pDst)
2{
3 ////......
4}
END
→点关注,不迷路←