C 语言 - const 关键字
声明变量
const int number = 10;
使用 const 声明数组
有时需要把数组设置为只读,这样,程序只能从数组中检索,不能把新值写入数组。要创建只读数组,应该使用 const
声明和初始化数组。
eg 1. 只读整型数组
const int days[MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
注意:使用上述形式初始化数组只能在声明数组的同时进行初始化,以下是错误的方法:
/* 错误的方法 [Error] expected primary-expression before ']' token
int a[10];
a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
*/
eg 2. 只读字符串数组
const char * color[8] = {"black", "red", "green", "yellow",
"blue", "magenta", "cyan", "white"};
保护数组中的数据
C 语言在处理函数时通常使用指针传递,因此会使用到原始数据而不是直接传值数值时用到的副本。这样的函数可以修改原数组,所以编程错误可能会破坏原始数据。
eg 3. 错误的代码
int sum(int ar[], int n)
{
int i;
int total = 0;
for(i = 0; i < n; i ++)
total += a[i]++; //错误递增了每个元素的值
return total;
}
如果函数的意图不是修改数组中的数据内容,那么在函数原型和函数定义中声明形式参数时使用关键字 const
。
eg 4. 打印数组中的元素
void show_array(const int ar[], int n); // 函数原型
void show_array(const int ar[], int n); // 函数定义
{
// 省略
}
指向 const 的指针
1、指向 const 的指针不能用于改变值,意思就是不能通过该指针来改变他所指向的值。
2、指向 const 的指针可以使其指向别处。
eg 5. 指向 const 的指针
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double * pd = rates; // 指向数组首元素
*pd = 29.99; // 不允许
pd[2] = 3.14; // 不允许
rates[0] = 99.99; // 允许,rates 未被 const 限定
指向 const 的指针通常用于函数形参中,表明该函数不会使用指针改变数据。如 eg 4.
另外注意不能把 const 数据的地址赋值给普通指针。
const 指针
const 指针是一个不能指向别处的指针。
eg 6. const 指针
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
double * const pd = rates; // 指向数组首元素
pd = &rates[2]; // 不允许
*pd = 92.99; // 允许
创建指针时可以使用 const 两次,该指针既不可以更改它所指向的位置,也不能修改指向地址上的值:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double * const pd = rates;