C语言学习----const 的高级用法

在C Primer Pluse 第六版中 对于const的用法又更深入了解了一些

本blog为 C Primer Plus 的记录~
☘️对于const 之前一般了解的就是它作为常量的使用 今天了解到它的其他用法~
省流:可以直接看总结 哈哈哈哈哈~

文章目录

  • const 的用法
    • 在函数中的使用
      • 形参采用const
    • const指针
    • 其他用法
    • 总结

const 的用法

在函数中的使用

对于函数而言,我传入的参数是数组的首地址,或者指针都会改变原有的数组。但是如果我不想改变原有的数组应该怎么做呢?

形参采用const

如果函数的意图不是修改数组中的数据内容,那么在函数原型和函数定义中声明形式参数时应使用关键字const。

int sum(const int ar[], int n); /* 函数原型 */

以上代码中的const告诉编译器,该函数不能修改ar指向的数组中的内
容。如果在函数中不小心使用类似ar[i]++的表达式,编译器会捕获这个错
误,并生成一条错误信息。

这样使用const并不是要求原数组是常量,而是该函数在处理数组时将其视为常量,不可更改。 这样使用const可以保护数组的数据不被修改,就像按值传递可以保护基本数据类型的原始值不被改变一样。一般而言,如果编写的函数需要修改数组,在声明数组形参时则不使用const;如果编写的函数不用修改数组,那么在声明数组形参时最好使用const。

const指针

虽然用#define指令可以创建类似功能的符号常量,但是const的用法更加
灵活。可以创建const数组、const指针和指向const的指针

指向const的指针不能用于改变值

double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
const double * pd = rates;   // pd指向数组的首元素

第2行代码把pd指向的double类型的值声明为const,这表明不能使用pd
来更改它所指向的值:

*pd = 29.89;   // 不允许
pd[2] = 222.22;  //不允许
rates[0] = 99.99; // 允许,因为rates未被const限定

无论是使用指针表示法还是数组表示法,都不允许使用pd修改它所指向
数据的值。但是要注意**,因为rates并未被声明为const,所以仍然可以通过**
rates修改元素的值。 另外,可以让pd指向别处:

pd++; /* 让pd指向rates[1] -- 没问题 */

指向 const 的指针通常用于函数形参中,表明该函数不会使用指针改变
数据。

void show_array(const double *ar, int n);

❗️ 关于指针赋值和const需要注意一些规则。首先,把const数据或非const
数据的地址初始化为指向const的指针或为其赋值是合法的:

大白话就是:const如果是一个指针变量,它可以指向const数据或者非const数据;这两者都不等更改这个指针变量的值。但是非const数据是可以更改的,所以可以更改非const数据来更改元素的值。(这句话没有理解的话,多翻翻上面的例子)

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];       //有效

❗️ 只能把非const数据的地址赋给普通指针:

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];    // 有效
void show_array(const double *ar, int n);
void mult_array(double ar[], int n, double mult);

如 show_array()函数可以接受普通数组名和 const数组名作为参数,因为这两种参数都可以用来初始化指向const的指针:

show_array(rates, 5);    // 有效
show_array(locked, 4);   // 有效

因此,对函数的形参使用const不仅能保护数据,还能让函数处理const数组。

另外,不应该把const数组名作为实参传递给mult_array()这样的函数:

mult_array(rates, 5, 1.2);   // 有效
mult_array(locked, 4, 1.2);   // 不要这样做

用非const标识符(如,mult_arry()的形参ar)修改const数据(如,locked)导致的结果是未定义的。

其他用法

const还有其他的用法。

可以声明并初始化一个不能指向别处的指针,关键是const的位置:

注意:

上述是

const double * pc=rates;

这里是double * const pc = rates;

double rates[5] = {88.99, 100.12, 59.45, 183.11, 340.5};
double * const pc = rates; // pc指向数组的开始
pc = &rates[2];       // 不允许,因为该指针不能指向别处
*pc = 92.99;        // 没问题 -- 更改rates[0]的值

可以用这种指针修改它所指向的值,但是它只能指向初始化时设置的地址。

在创建指针时还可以使用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;   //不允许

总结

☘️在函数中,const可以作为形参

一般而言,如果编写的函数需要修改数组,在声明数组形参时则不使用const;如果编写的函数不用修改数组,那么在声明数组形参时最好使用const。

指向const的指针

把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的

只能把非const数据的地址赋给普通指针

其他用法

可以声明并初始化一个不能指向别处的指针 用这种指针修改它所指向的值,但是它只能指向初始化时设置的地址

在创建指针时还可以使用const两次,该指针既不能更改它所指向的地址,也不能修改指向地址上的值

ok,完结~ 如果有帮助的话,点个赞 (●ˇ∀ˇ●)

你可能感兴趣的:(C语言学习,c语言,学习,const的用法,笔记)