常量指针和指针常量,两个经常弄混淆的名词之一。
常量指针:本质是个指针,常量是用来修饰指针所指向的内容的。例如:const int *p = 5、int const *p = 5
指针常量:本质是一个变量,指针是用来表明这个变量里面存放的是指针。例如:int *const p = 5
那怎么来区分给出的是常量指针还是指针常量呢?简单的方式是*表示指针,const表示常量,就看给出的*和const的先后顺序从左向右读就知道了。
例如:const int *p = 5; const在前,*在后,所以按顺序读就是常量指针。
int const *p = 5; const在前,*在后,所以按顺序读还是常量指针。
int *const p = 5; *在前,const在后,按顺序读就是指针常量。
那么常量指针和指针常量有什么特点呢?
1、常量指针:由于本质是一个指针,而指向的内容是常量。所以可以得到以下几点信息:
a)、这个指针里面放的地址指向的内容是一个常量,也就是通过这个地址不能去修改指向内存单元的内容。
b)、这个指针里面的值是一个变量是可以变化的,变化之后的地址可以是任意合法的地址。
这个就好比是手机的里的SIM卡槽就相当于一个指针,这个SIM卡就相当于放在指针里的地址,而这张SIM的指向内容就是这张卡的号码一样。一个手机可以默认初始化时插入一张SIM卡,我们可以更换SIM来变更手机号码,但是却不能通过不更换SIM卡就变更手机号码一样。同样的道理,可以解释下面代码中的内容:
#include <stdio.h>
int main()
{
const int a = 5;
const int *b = &a; //正常初始化
*b = 6; //非法赋值,原因是打算修改常量a的内容
int c = 7;
b = &c; //合法的
*b = 9; //非法的,error: assignment of read-only location
const int d = 8;
b = &d; //合法的
return 0;
}
在上面的代码中,可以给b赋值一个常量也可以给它赋值一个变量的地址,但是不管是赋值常量还是变量的地址,都无法通过这个地址去修改变量的内容。也就是可以修改指针的值但却无法通过该指针修改指针所指向的内存单元的内容。
2、指针常量:本质是一个常量,而指向的内容却不一定是常量。通过这句话同样可以得到两点信息:
a)、这个指针里面的值是一个常量,也就是这个指针只会指向一个初始化时确定的内存单元。
b)、指针所指向的内存单元的内容是可以通过该指针改变的。
如下面代码中的内容:
#include <stdio.h>
int main()
{
const int a = 5;
int *const b = &a; //正常初始化
*b = 6; //合法的
int c = 7;
b = &c; //非法的,assignment of read-only variable ‘b’
return 0;
}
在上面的代码中,可以通过指针b去修改内存a的内容,但是却不可以修改b指针的内容。也就是说可以修改指针指向单元的内容,却不可以修改指针的内容。