关于常量指针 和 指针常量及 typedef 中一些难以理解的知识

一.  常量指针和指针常量

先把我在验证过程中的代码贴出来吧。

	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个语句到底怎么理解还是不懂,随着学习的深入,再解决吧。

………………………………



  





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值