【提示:本文含有“不太绕的”指针内容】
【注意:在全部看完前不要真的去试】
我们知道,可以用[mw_shl_code=c,false]const int a=3;[/mw_shl_code]来定义一个整型常量。而这时使用诸如“a=3”、“a++”这类语句是不行的。那么,常量的值到底能不能修改?
我们还得从指针说起。下面有这样三条声明:[mw_shl_code=c,false]int* p1;
int const* p2;
const int* p3;[/mw_shl_code]其中:[mw_shl_code=c,false]指针p1的类型是int*,指向整型变量;
“常量指针”p2的类型是int const*,指向整型变量,p2的值不可以修改;
“指针常量”p3的类型是const int*,指向整型常量。[/mw_shl_code]p2指向普通的变量,但它自己的值不能修改,也就是说我让它指向a了,就不能再p2=&b;了。可以理解成“const是修饰*的”。p3呢?它本身可以修改,但只能指向常量(const int)。所以说“const是修饰int的”。
为什么要有p3呢?一般的指针不行吗?
先来看一段代码:[mw_shl_code=c,true]#include <stdio.h>
int main()
{
const int a=3;
int p=(int*)&a;
(*p)=100;
printf("%d",a);
return 0;
}[/mw_shl_code]现在,a从3变为100了。
因为我们先获取了a的地址,再把地址的值改为100,躲过了编译器的检查。
运行一下,3!!!
为什么?
检验一下,把地址一起输出:[mw_shl_code=c,false]printf("%p %p",&a,p);[/mw_shl_code]62FE44 62FE44
同一个地址不同数值!
啊哈!原来是该死的编译器优化。
文件名.cpp改成.c,成功了。[mw_shl_code=c,false]100[/mw_shl_code]
现在,可以回答为什么用const int*了:这样,可以确保*p=100;通不过编译。
【本文不建议使用如此方法修改常量的值,只是强调:常量就是“常变量”,运行时和变量没有任何区别,只是编译时禁止了类似赋值的操作。】
对了,还有一点:注意编译器优化!
|