可以⽤const关键字创建不允许修改的数组:
const int days1[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
1.在指针和形参声明中使⽤const
声明普通变量和数组时使⽤ const 关键字很简单。指针则复杂⼀
些,因为要区分是限定指针本⾝为const 还是限定指针指向的值为
const。下⾯的声明:
const float * pf; /* pf 指向⼀个float类型的const值 */
创建了 pf 指向的值不能被改变,⽽ pt 本⾝的值可以改变。例如,
可以设置该指针指向其他 const值。相⽐之下,下⾯的声明:
float * const pt; /* pt 是⼀个const指针 */
创建的指针pt本⾝的值不能更改。pt必须指向同⼀个地址,但是它
所指向的值可以改变。下⾯的声明:
const float * const ptr;
表明ptr既不能指向别处,它所指向的值也不能改变。
还可以把const放在第3个位置:
float const * pfc; // 与const float * pfc;相同
如注释所⽰,把const放在类型名之后、*之前,说明该指针不能⽤
于改变它所指向的值。简⽽⾔之, const放在*左侧任意位置,限定了
指针指向的数据不能改变;const放在*的右侧,限定了指针本⾝不能改
变。
const 关键字的常⻅⽤法是声明为函数形参的指针。例如,假设有
⼀个函数要调⽤ display()显⽰⼀个数组的内容。要把数组名作为实际
参数传递给该函数,但是数组名是⼀个地址。该函数可能会更改主调
函数中的数据,但是下⾯的原型保证了数据不会被更改:
void display(const int array[], int limit);
在函数原型和函数头,形参声明const int array[]与const int * array
相同,所以该声明表明不能更改array指向的数据。
ANSI C库遵循这种做法。如果⼀个指针仅⽤于给函数访问值,应
将其声明为⼀个指向const限定类型的指针。如果要⽤指针更改主调函
数中的数据,就不使⽤const关键字。例如,ANSI C中的strcat()原型如
下:
char *strcat(char * restrict s1, const char * restrict s2);
回忆⼀下,strcat()函数在第1个字符串的末尾添加第2个字符串的
副本。这更改了第1个字符串,但是未更改第1个字符串。上⾯的声明
体现了这⼀点。