const的高级用法

本文主要展示constant数组、constant指针和指向constants的指针的用法。

const int days[MONTHS] = {31,28,31,30,31,30,31,31,30,31,30,31}; days[9] = 44; /*编译出错 */ //指向常量的指针不能用于改变指向的数据的值,具体可以参考下面的代码 : double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double * pd = rates; // pd points to beginning of the array/* 上面代码的第二行将pd指针指向的对象为const类型,这意味着你不能**使用pd指针**来改变pd所指向的对象的值: */ *pd = 29.89; // 不允许 pd[2] = 222.22; // 不允许 rates[0] = 99.99; // 允许,因为rates数组不是const类型//在上面的例子中,不管使用指针标记法(*pointer)还是数组标记(pointer[i]), //你都不能使用指针pd改变所指向内容的值。但是,rates没有被声明//为const, //所以你仍然可以使用rates来改变数值。当然,你可以让pd指向其它位置:pd++; /*使pd指向rates[1],允许*//*指向常量的指针用作函数的形参时,表明函数不打算用指针改变数据。例如, 函数*/void show_array(const double ar[], int n); /*可以声明为这样的形式*/:void show_array(const double *ar, int n); /* 可以将非常量数据或者常量数据的地址赋给指向常量的指针: */ double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double locked[4] = {0.08, 0.075, 0.0725, 0.07}; const double * pc = rates; // 合法 pc = locked; // 合法 pc = &rates[3]; //合法/*然而只有非常量的数据的地址可以赋给普通的指针:*/ double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double locked[4] = {0.08, 0.075, 0.0725, 0.07}; double * pnc = rates; // 合法 pnc = locked; // 不合法 pnc = &rates[3]; // 合法/*函数show_array()可以接收普通的数组或者常数组作为实参,因为二者的地址都可以赋给指向常量的指针:*/ show_array(rates, 5); // 合法 show_array(locked, 4); // 合法/* 因此,使用在函数声明时使用const不仅可以保护数据,还允许函数接收常数组。像下面的函数 mult_array()不能接收常数组的地址: */ mult_array(rates, 5, 1.2); // 合法 mult_array(locked, 4, 1.2); // 不合法

【const的高级用法】show_array()原型为void show_array(const double ar[], int n);
或者void show_array(const double*, int );
mult_array()函数原型为void mult_array(double ar[], int n, double mult);
函数原型可以参考数组形参文章
下面是关于const的更多用法,比如,声明和初始化指针时使指针只能指向一个地方,而声明方式有点戏剧性,只是和const的位置和上面例子中的不一样:
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
double * const pc = rates; // pc指向数组的首地址
pc = &rates[2]; // 不合法,pc不能指向其它地方
*pc = 92.99; // 合法,pc的值不能变但是指向的对象的值能变
这样的指针依然可以改变指向的对象的值,但是它只能指向最初被赋予的位置。
如果你希望指针值和指针指向的值不变,你可以使用两个const
double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5}; const double * const pc = rates; ` pc = &rates[2]; // 不允许 *pc = 92.99; // 不允许

    推荐阅读