《C和指针》笔记2: const关键字
在C和C++中,常量的样子和变量完全一样,但是它们的值不能改变。可以使用const关键字来声明常量:
下面的声明都是可以的:
int const a;
const int a;
这两条语句都把a声明为一个整数。它的值不能发生改变。但是这样a的值无法改变。所以无法将任何东西赋值给它。如此以来,怎样才能让他一开始拥有一个值呢?有两种情况。
第一种,在声明的时候同时进行初始化。如下所示:
int const a = 15;
第二种,在函数中声明为const的形参,在函数被调用会得到实参的值。
当涉及指针变量时,有两样东西可能变成常量:指针变量和它所指向的实体。比如:
int *pi;
pi是一个普通的指向整型的指针。
如果加上const关键字可能有以下几种情况:
int const *pci;//指向整型常量的指针,指针的值可以修改,但不能改变它所指向的值。
int * const cpi;//指向整型的常量指针。无法修改指针的值,但可以修改指针所指向的整型的值。
int const * const cpci;//指向整型常量的常量指针。指针的值和指针所指向的整型的值都不可以修改。
记忆方法:从左往右看。最靠近const左边是什么类型说明什么类型被指定为常量。
第一句int const *pci;
最靠近const左边是int,指针指向的是int const类型,指针所指向的int const类型的值不能更改,但是指针的值可以修改。
第二句int * const cpi;
最靠近const左边是int *, 指针是常量不能改,但是指针指向的整型的值可以改。
第三句int const * const cpci;
就是把第一句和第二句的情况合并起来看的。
const用在哪里
当声明变量时,如果变量的值不会被修改,应当在声明中只用const的关键字。这种做法不仅使你的意图在其他阅读你的程序的人面前得到更清晰的展现,而且当这个值被意外修改时,编译器能够发现这个问题。
和#define的对比
#define指令是另一种创建名字常量的机制。下面两个声明都为50,这个值创建了名字常量:
#define MAX_ELEMENTS 50
int const max_elements = 50;
在这种情况下使用#define以使用const变量更好。因为只要允许使用字面值常量的地方都可以使用前者,比如声明数组的长度。const变量只能用于允许使用变量的地方。
摘录自:《C和指针》38-39