一. 常量指针和指针常量
先把我在验证过程中的代码贴出来吧。
int i =0;
int * const p1 = &i;//这是常量指针,常量指针必须本初始化,始终指向一个对象的地址,(有点像引用)
const int j = 0;
const int *const p2 = &i;//指向常量对象的常量指针可以指向普通变量,但也必须初始化
const int *const p3 = &j; //p3是一个指向常量对象的常量指针,只要是常量指针必须被初始化
//可以通过常量指针修改变量的值,但是不可以令常量指针再指向其他对象
//p2 = &j; //这样就是错误的
const int *p4;//指针常量,可以不必初始化 ,可以指向多个对象
p4 = &i;
p4 = &j;
// *p4 = 5; //这就是错误的,不能通过指针 来修改变量的值
// const text p5; //错误 , 如果只是简单的认为 把 text 替换成 int *,那就打错特错了,
const char *p5; //正确 ,如果只是简单的认为
分析:
(1)
int i =0;
int j = 1;
int * const p1 = &i;
可以从左往右看,const修饰的是*,即就是修饰的是指针,这是一个常量指针,所指的对象是唯一的,所以必须初始化。
如果 p1 = &j;这样即使非法的,但是可以通过指针常量修改这个变量的值。
如 *p1 = 2;
const int j = 3;
const int *const p2 = &i;
//指向常量对象的常量指针可以指向普通变量,但也必须初始化
const int *const p3 = &j;
//p3是一个指向常量对象的常量指针,只要是常量指针必须被初始化
可以通过常量指针修改变量的值,但是不可以令常量指针再指向其他对象
p2 = &j; //这样就是错误的
**********************************************************************
(2)
const int *p4; //指针常量,可以不必初始化 ,可以指向多个对象
p4 = &i;
p4 = &j; //这样都是可行的
但是这样就不行了
*p4 = 5; //试图通过指针改变变量的值,这就是错误的,不能通过指针 来修改变量的值
(3)还有一个容易出现的小问题
const int m = 3;
int *p = &m; // 这样也是错误的,p只是一个普通的指针,如果可以的话,那么我们就可通过指针改变常量m的值,但是m是常量,明显很矛盾。
二 指针,常量 和 类型别名(详见C++primer(第5版))------61页
typedef int * text; //text 是int*的别名,这是无可置疑的
const text p5 = 0; //首先说明这句话是正确的,同时也必须初始(为什么??)
现在如果我们要分析这句话,一般情况下,我们会用简单替换的方法,则这句话会改成
const int *p5 ; //先把上面那句话注释掉,这句就是正确的,是不是很奇怪,没有初始化
也可以正常编译,怎么回事???我也在纳闷,经过看书,不能这样理解,应该把
const text p5 = 0; 理解成这样一句话 int * const p5 = 0;这是什么??是常量指针。也就是说不能随便替换。
…………………………………………………………………………………………………………………………
关于 typedef 的深入理解还得进一步的学习呀,今天只是看了这里,觉得不懂,就随便的记下了其实这里还有一个问题,都没有弄懂
typedef char *pstring ;
const pstring cstr = 0; // cstr 是指向char 的常量指针
const pstring *ps; // ps 是一个指针 ,它的对象是指向 char 的常量指针
就是关于第3个语句到底怎么理解还是不懂,随着学习的深入,再解决吧。
………………………………