1.const修饰变量
众所周知,变量是可以被修改的,但是如果我们希望给变量加上一些限制,不能被修改,怎么做呢?这就是const的作用。
直接上代码:
#include <stdio.h> int main() { const int a = 10; a = 20; return 0; }
调试结果直接报错:
这是因为当a被const修饰后,在语法上加上了限制,使a具有了常属性(不能被修改了)。但是本质上还是一个变量,不是常量。
但是如果我们绕过a,使用a的地址,去修改a就可以做到。其实这就相当于我们给a关了门,上了锁,在原则上a被限制了,但是有人打破窗户,翻窗进去把a给修改了。
#include <stdio.h> int main() { const int a = 10; printf("修改前:%d\n", a); int* p = &a; *p = 20; printf("修改后:%d\n", a); return 0; }
运行结果是:
可以看见a确实被修改了。这里我们可以思考一下,为什么n要被const修饰呢?就是为了不能被修改,如果p拿到n的地址就能修改n,这样就了const的限制,这是不合理的,所以应该让p拿到n的地址也不能修改n,那接下来怎么做呢?
2.const修饰指针变量
一般来讲const修饰指针变量,可以放在 * 左边,也可以放 * 右边,其意义是完全不同的。
1.int* p; //没有const修饰
2. int const * p或const int* p; //放在左边
3. int * const p; //放在右边
2.1 const放在 * 左边
上代码:
#include <stdio.h> int main() { int a = 10; int b =20; int const * p = &a; //p = &b;//ok *p=200;//err return 0; }
const放在* 左边时,限制的是指针指向的内容,不能通过指针来修改!
但是p本身的内容可变。
2.2 const放在 * 右边
上代码:
#include <stdio.h> int main() { int a = 10; int b = 20; int* const p = &a; p = &b;//err return 0; }
const放在*右边时,限制的直接是p本身,p里面原本存的是a的地址,现在想改b的地址,不行!
但是我们可以把p所指向的空间里的内容修改。
#include <stdio.h> int main() { int a = 10; printf("修改前:%d\n", a); int* const p = &a; *p=200; printf("修改后:%d\n", a); return 0; }
const修饰指针变量时:
1.const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。
但是指针变量本身的内容可变。
2.const如果放在*的右边,修饰的是指针变量本身,保证了指针变量的内容不能修改,但是指针指
向的内容,可以通过指针改变。