声明变量

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;

标签: const

添加新评论