在这里就不再重复C/C++ 常量指针,指针常量的概念了,以下以一个例题作为讲解,
题目是华为的一个选择题:
刚开始我一直以为答案是C,D一样,但是经过分析后,我产生了较大的困惑,希望能得到大神的指导:
个人觉得A,B是等价的同时C,D也是等价的。
A,B中,const位于*的左边,表示指针所指向的对象是常量,不能更改,但是指针是可以更改的,比如可以进行++,--等操作。
相反的若const位于*的右边,表示指针本身不能更改,不能进行++、--、移位等操作,但是指针所指向的对象可以更改。
下面举个例子:(程序中注释的语句都是错误的语句)
A,B中,const位于*的左边,表示指针所指向的对象是常量,不能更改,但是指针是可以更改的,比如可以进行++,--等操作。
相反的若const位于*的右边,表示指针本身不能更改,不能进行++、--、移位等操作,但是指针所指向的对象可以更改。
下面举个例子:(程序中注释的语句都是错误的语句)
#include <iostream>
using namespace std;
int main()
{
int a=5;
int b=10;
int c=20;
cout<<&a<<endl;
cout<<&b<<endl;
cout<<&c<<endl;
const int *p1=&b;
p1++;
// *p1=20;
int const *p2=&b;
p2++;
// *p2=20;
const *int p3=&b;
p3++;
// *p3=20;
int * const p4=&b;
// p4++;
*p4=100;
const int * const a1=&b;
int const * const a2=&b;
// a1++;
// a2++;
// *a1=200;
// *a2=100;
cout<<*p1<<" "<<*p2<<" "<<*p3<<" "<<endl;
return 0;
}
运行结果:
程序中,变量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,即指针不能改变,但是可以改变指针所指向的对象。
而对于指针p4,int * const p4=&b,*位于const的左边,const修饰的是指针p4,即指针不能改变,但是可以改变指针所指向的对象。
同理const int * const a1=&b;,int const * const a2=&b;是指向常量的常指针,即指针本身和其指向的对象都不能更改。