指针常量和指针常量,从字面上就很让人混淆不分。指针常量,英文名是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>