C/C++ 常量指针,指针常量

来源:互联网 发布:安卓ssr软件 编辑:程序博客网 时间:2024/06/05 04:56

在这里就不再重复C/C++ 常量指针,指针常量的概念了,以下以一个例题作为讲解,

题目是华为的一个选择题:

刚开始我一直以为答案是C,D一样,但是经过分析后,我产生了较大的困惑,希望能得到大神的指导:

个人觉得A,B是等价的同时C,D也是等价的。
A,B中,const位于*的左边,表示指针所指向的对象是常量,不能更改,但是指针是可以更改的,比如可以进行++,--等操作。
相反的若const位于*的右边,表示指针本身不能更改,不能进行++、--、移位等操作,但是指针所指向的对象可以更改。
下面举个例子:(程序中注释的语句都是错误的语句)
[cpp] view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4.    
  5. int main()  
  6. {  
  7.     int a=5;  
  8.     int b=10;  
  9.     int c=20;  
  10.     cout<<&a<<endl;  
  11.     cout<<&b<<endl;  
  12.     cout<<&c<<endl;  
  13.     const int *p1=&b;  
  14.     p1++;  
  15. //  *p1=20;  
  16.     int const *p2=&b;  
  17.     p2++;  
  18. //  *p2=20;  
  19.     const *int p3=&b;  
  20.     p3++;  
  21. //  *p3=20;  
  22.   
  23.     int * const p4=&b;  
  24.       
  25. //  p4++;  
  26.     *p4=100;  
  27.   
  28.     const int * const a1=&b;  
  29.     int const * const a2=&b;  
  30. //  a1++;  
  31. //  a2++;  
  32. //  *a1=200;  
  33. //  *a2=100;  
  34.   
  35.   
  36.   
  37.     cout<<*p1<<" "<<*p2<<" "<<*p3<<" "<<endl;  
  38.   
  39.     return 0;  
  40. }  

运行结果:

程序中,变量a,b,c存储在栈中,存储的地址按低地址方向扩展。
const int *p1, int const *p2, const * int p3都指向b的地址,由以上可知p1,p2,p3都是指向常对象的指针,即指针所指向的对象
不能更改,但指针可以更改,如进行++操作。进行++以为操作后,指向变量a的地址,所以进行解引用(*)时输出变量a的值。但是在定义p3的时候出现了一个警告://
: warning C4518: 'int ' : storage-class or type specifier(s) unexpected here; ignored
而对于指针p4,int * const p4=&b,*位于const的左边,const修饰的是指针p4,即指针不能改变,但是可以改变指针所指向的对象。

同理const int * const a1=&b;,int const * const a2=&b;是指向常量的常指针,即指针本身和其指向的对象都不能更改。
0 0
原创粉丝点击