指针常量和常量指针,你到底明白了多少?
2015-01-09 14:45
274 查看
指针常量和指针常量,从字面上就很让人混淆不分。指针常量,英文名是pointer costant,而常量指针,英文名是costant pointer,稍微留意一下,这个“而”不是转折,是并行。所以,首先得分清楚两者之间的区别。
结果输出如下:
![](http://img.blog.csdn.net/20150109151907028?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmFzbWluZV9zaGluZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
指针必须初始化,否则就内存泄露。所以,根据以上代码可以清楚地知道,谁在前面,就是什么类型,常量+指针,就是常量指针,反之就是指针常量。所以,亲爱的小伙伴们,明白怎么区分了吗?
那么,问题就来了,到底这两者之间的区别是什么呢?
下面我们就来看一段代码:
p1是常量指针,当我们企图改变它的地址和它指向的内容的时候,发现指向的内容是不可变的。其实从字面上也可以解释,一个指针都已经是常量了,(所谓的指针也就是变量,只不过这个变量保存的是地址值,也就是内存),那我们是不能动它的了。但是,我们可以改变p的地址,也就是指针的值,当然啦,地址变了,地址指向的内容也就随之变化了。即输出结果:
![](http://img.blog.csdn.net/20150109152013859?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmFzbWluZV9zaGluZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
p1改变了地址,内容也随之跟新了,我这里用的词是更新,因为地址指向的是变量a,而a的值是4。所以,本质上,从操作上是不能刻意去改变指针指向的内容的值,只要把其指向的地址更新就可以了。
p2改变了其指向的内容的值后,p2的地址倒是没变。就相当于这个内存保存的内容换了。注意这里是“换”。
附上整个源代码,供参考:
<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>
相关文章推荐
- 指针的大小到底是由谁决定?是多少?
- 指针的大小到底是由谁决定?是多少?
- 指针的大小到底是由谁决定?是多少?
- 指针的大小到底是由谁决定?是多少?
- 指针到底能不能修改其指向的常量字符串?
- 指针到底能不能修改其指向的常量字符串?&向NULL地址copy数据
- 指针的大小到底是由谁决定?是多少?
- 指针的大小到底是由谁决定?是多少?
- 指针的大小到底是由谁决定?是多少?
- 到底有多少种智能指针(smart pointer)
- 指针的大小到底是由谁决定?是多少?
- 到底有多少种智能指针(smart pointer)
- 指针数组,数组指针,傻傻分不清?常量指针,指针常量到底谁不变?数组引用,引用数组,到底有没有?
- 指针的大小到底是由谁决定?是多少?
- 指针的大小到底是由谁决定?是多少?(
- 指针的大小到底是由谁决定?是多少?
- 指针的大小到底是由谁决定?是多少?
- 指针的大小到底是由谁决定?是多少?
- 指针的大小到底是由谁决定?是多少?
- 指针到底能不能修改其指向的常量字符串?