(1)const int p;
(2)const int* p;
(3)int const* p;
(4)int * const p;
(5)const int * const p;
(6)int const * const p;
第一种是常量整数,没什么好说的。
后面五种是指针,有一个简便的办法记忆。
从右往左读,遇到p就替换成“p is a ”遇到*就替换成“point to”。
比如说,
(2)读作:p is a point to int const p是一个指向整型常量的指针(常量指针)。
(3)读作:p is a point to const int.意思跟(2)相同。
(4)读作:p is a const point to int.p是一个指针常量,指向整型。
(5)读作:p is a const point to int const.
(6)读作:p is a const point to const int.(5)和(6)的意思相同,p都是指向常量的指针常量,指向整型。
这种方法来源于《c primer plus》,这里也向c初学者推荐此书。
指针常量
落点在常量上,这说明了指针常量是一个常量,类型是指针类型。 如果写int const a = 5那么a就是一个整型常量(尽管我们一般不是这么描述),所以指针常量应该如下定义,
int *const p = #
p is a const point to int
p是一个const指针(地址不可变,即不可以更改地址),指向int变量
从右向左看,离p最近的是const,首先说明了p是一个常量。在这里,const是一个顶层const因为它本身是一个常量,我们初始化的时候将p指向num,完成了初始化, 所以常量p不能在指向其他的变量(或是常量),也就是说们再写p = &num2;
编译是不会通过的。
常量指针
落点是指针,说明常量指针是一个指针,不同的是它指向的是一个常量。
const int a = 5;
const int * p = &a;
从右向左看首先是一个*(指针的标志),首先说明p是一个指针,再向左看,是一个指向常量的指针,
所以p指向的是一个常量我们就不能更改*p的值,但是p本身不是一个常量所以我们可以改变p 指向的变量。
int const *p = &a;
需要注意的是这还是一个常量指针,从右向左看与上面的结果是一致的。
*p = 6(不合法)
int b = 6;
p=&b;(合法)
网友评论