前言
const是constant的缩写,表示海枯石烂,恒定不变,一旦相伴,永不变心。只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改。
虽然const相对比较容易理解,但是const不仅仅可以用来修饰基本类型,它还经常修饰一些构造类型和指针及其参合体,如数组、指针、指针数组、结构体数组、结构体指针数组等。一旦和这些复杂类型结合起来,还是具有一定迷惑性的,下面我们一一进行分析。
(1)const int a = 10;
(2)int const a = 10;
(3)const int a[10] = {1,2,3,4,5,6,7,8,9,10};
(4)const int *p;
(5)int *const p;
(6)const struct devices dev[5];
(7)struct devices const *dev[5];
看到上面的例子,我相信很多小伙伴都觉得头大。不过,我这里有两招辨别的小技巧:
*将类型去掉
*看const修饰谁,谁的值就不能去掉
(1)去掉类型int变成“const a = 10”,a的值不变;
(2)去掉类型int变成“const a = 10”,a的值不变,和(1)的效果一样;
(3)去掉类型int变成“const a[10]”,a数组里的值不变;
(4)const修饰 * p,去掉类型int变成“const * p”,p指向的空间里的值不变;
(5)const修饰p,去掉类型int * 变成“const p”,指针变量p里的值不变,也就是说p不能指向其他地址,但是p指向空间里的值可以变;
(6)去掉类型struct devices变成“const dev[5]”,dev[5]数组里的值不变;
(7)这是一个devices结构体类型的指针数组,它拥有5个devices结构体指针,每个指针指向一个devices结构体,const修饰 *dev[5],去掉类型struct devices 变成“const *dev[5]”,指针数组dev中每个元素指向的空间里的值不变。