总之一句话,这次的 pi 是一个指向 int 变量类型数据的指针常量。
我最后总结两句:
1).如果 const 修饰在*pi 前则不能改的是*pi(即不能类似这样:*pi=50;赋值)而不是指 pi。
2).如果 const 是直接写在 pi 前则 pi 不能改(即不能类似这样:pi=&i;赋值)。
请你务必先记住这两点,相信你一定不会再被它们给搞糊了。现在再看这两个申明语句 int const
*pi 和 int * const pi 时,呵呵,你会头昏脑胀还是很轻松惬意?它们各自申明的 pi 分别能修改什么,
不能修改什么?再问问自己,把你的理解告诉我吧,可以发帖也可以发到我的邮箱(我的邮箱 yyf977
@163.com)!我一定会答复的。
3.补充三种情况。
这里,我再补充以下三种情况。其实只要上面的语义搞清楚了,这三种情况也就已经被包含了。
不过作为三种具体的形式,我还是简单提一下吧!
情况一:int * pi 指针指向 const int i 常量的情况
//**********begin*****************
const int i1=40;
int *pi;
pi=&i1;//这样可以吗?不行,VC 下是编译错。
//const int 类型的 i1 的地址是不能赋值给指向 int 类型地址的指针 pi 的。否则
pi 岂不是能修改 i1 的值了吗!
pi=(int* ) &i1;//这样可以吗?强制类型转换可是 C 所支持的。
//VC下编译通过,但是仍不能通过*pi=80 来修改 i1 的值。去试试吧!看看具
体的怎样。
//***********end***************
情况二:const int * pi 指针指向 const int i1 的情况
//*********begin****************
const int i1=40;
const int * pi;
pi=&i1;//两个类型相同,可以这样赋值。很显然,i1 的值无论是通过 pi 还是 i1
都不能修改的。
//*********end*****************
情况三:用 const int * const pi 申明的指针
//***********begin****************
int i