指针常量和常量指针,你到底明白了多少?

指针常量和指针常量,从字面上就很让人混淆不分。指针常量,英文名是pointer costant,而常量指针,英文名是costant pointer,稍微留意一下,这个“而”不是转折,是并行。所以,首先得分清楚两者之间的区别。

<span style="font-family:Comic Sans MS;">	int a =4;
	int b = 5;
	int c = 6;
	int const *p1 = &b;//const 在前,定义为常量指针</span>
<span style="font-family:Comic Sans MS;">	int *const p2 = &c;//*在前,定义为指针常量 </span>
<span style="font-family:Comic Sans MS;"><span style="white-space:pre">	</span>cout << "old values and pointer's address" << endl; 
<span style="white-space:pre">	</span>cout << p1 << " " << *p1 << endl;
<span style="white-space:pre">	</span>cout << p2 << " " << *p2 << endl;
</span>

结果输出如下:


指针必须初始化,否则就内存泄露。所以,根据以上代码可以清楚地知道,谁在前面,就是什么类型,常量+指针,就是常量指针,反之就是指针常量。所以,亲爱的小伙伴们,明白怎么区分了吗?

那么,问题就来了,到底这两者之间的区别是什么呢?

下面我们就来看一段代码:

<span style="font-family:Comic Sans MS;">	p1 = &a;
	//*p1 = 23; //error:assignment of read-only location 
 	cout << p1 << " " << *p1 << endl;
	c = 22; 
	*p2 = c;
	//p2 = &b; //error:assignment od read-only variable 'p2' 
	cout << p2 << " " << *p2 << endl; </span>

p1是常量指针,当我们企图改变它的地址和它指向的内容的时候,发现指向的内容是不可变的。其实从字面上也可以解释,一个指针都已经是常量了,(所谓的指针也就是变量,只不过这个变量保存的是地址值,也就是内存),那我们是不能动它的了。但是,我们可以改变p的地址,也就是指针的值,当然啦,地址变了,地址指向的内容也就随之变化了。即输出结果:


p1改变了地址,内容也随之跟新了,我这里用的词是更新,因为地址指向的是变量a,而a的值是4。所以,本质上,从操作上是不能刻意去改变指针指向的内容的值,只要把其指向的地址更新就可以了。

p2改变了其指向的内容的值后,p2的地址倒是没变。就相当于这个内存保存的内容换了。注意这里是“换”。

附上整个源代码,供参考:

<span style="font-family:Comic Sans MS;">#include<iostream>
using namespace std;

int main() 
{ 
	int a =4;
	int b = 5;
	int c = 6;
	int const *p1 = &b;//const 在前,定义为常量指针
	int *const p2 = &c;//*在前,定义为指针常量 
	cout << "old values and pointer's address" << endl; 
	cout << p1 << " " << *p1 << endl;
	cout << p2 << " " << *p2 << endl;
	cout << "new values and pointer's address" << endl; 
	p1 = &a;
	//*p1 = 23; //error:assignment of read-only location 
 	cout << p1 << " " << *p1 << endl;
	c = 22; 
	*p2 = c;
	//p2 = &b; //error:assignment od read-only variable 'p2' 
	cout << p2 << " " << *p2 << endl; 
} </span>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值