常量指针与指针常量
试指出下面的指针的含义与区别:
1)const
int *a;
2)int
const *a;
3)int
* const a;
4)const
int *const a;
此题考查的是包含const关键字声明指针的含义。现分析如下:
1)const
int *a; //指针常量,指针指向的变量不能改变值
2)int
const *a; //指针常量,与const
int *a等价
3)int
* const a; //常量指针,指针本身不能改变值
4) const int *const a;//常量指针与指针常量
Bjarne博士在他的《The C++ Programming Language》里面给出过一个区别的方法:把一个声明从右向左读。例如:
char *const cp; ( 我们把“*”
读成 “pointer
to” )
cp is a const pointer to char //int* const指向常量的指针
const char * p;
p is a pointer to const char; //const int*常指针
char const * p;
同上因为C里面没有const *的运算符,所以const只能属于前面的类型。
int a[10];//数组是一个常量指针,等价于int * const a;a[0],a[1]
int * const a;//常量指针,指针不能改,但指向的内存能改
example:
int value = 5;
int *const a = &value;
int tmp = 100;
a = &tmp;//error
*a = 100;//right,value=100;
const int * a;//指针常量,指针能改,但指向的内存不能改
int const * a;
example:
const int value = 100;
const int * a = &value;
int tmp = 2;
*a = 5;//error
a = &tmp;//right
const int * const a;//a既是指针常量,也是常量指针,指针不能改,指向的内存也不能改
const int value = 1;
const int * const a = &value;
int tmp = 7;
a = &tmp;//error;
*a = 9;//error
//把*读作pointer to
int * const p;//p is a const pointer to int
const int * p;//p is a pointer to int const
int const * p;//p is a pointer to const int
const int * const p;//p is a const pointer to int const