《C Prime Puls》10.6学习笔记

115 阅读3分钟

const与指针

这一章节在书中的标题是《保护数组中的数据》,而实际上这一章讲的是const数据以及指针的一系列规范和用法。另外,之前漏掉的一个知识点:一个要处理数组的函数,需要接收数组数据,也就是在声明函数时,要数组作为形参,此时有两种表示方法,一种是数组表示法arr[],一种是指针表示法*pi,这里,要着重注意第一种表示方法,可以用如下方式写入:

void add(int ai[])

数组名+[](空方括号)这样的形参,表明这个参数接收数组类型的数据,也表明这里接收数组首元素的地址或者存储了首元素地址的指针

const数据

在之前的学习,对于商量,有两种形式,一种是#define符号常量,一种是const常量。那么二者有什么区别呢?const更加灵活,可以声明const数组、const指针和指向const类型的指针等等。(而#define不行) 对于接收数组数据的函数,分两种情况:

const形参--保护数组不被修改

一是只利用数组的数据来处理一些事,不改变数组本身的元素数据

二是修改数组本身的数据

对于第一种情况,我们只需要利用数组的数据,不修改它,那么为了防止不想要的情况发生,我们可以将形参声明为const,来保护接收到得数组数据在函数运作时绝对不会修改数组的数据,形如:

void add(const int ai[])

但要注意的是,声明了const形参,不代表实参一定是const,而是让函数认为它是const(常量),在函数内部绝对不会修改它本身的数据而已。

const与指针的用法

1.指向const的指针,不能改变所指对象的指(不然const就失去了意义)。但是,指向const的指针可以改变所指对象。

int arr[3]={1,2,3}
const int *pi = arr; //const的意义为这个指针不能修改所指对象的值。
pi++; //合法,pi从指向arr[0]变为ai[1]
pi = &arr[2]; //合法,pi指向ai[2];

2.const数据的地址不能赋给普通指针

int arr[3]={1,2,3};
const int ai[3]={4,5,6};
const int *pi = arr; //合法,const数组只能把地址赋给指向const的指针;
int *ptr = ai; //不合法,ai是const数组,不能赋给普通指针ptr;

为什么如此呢?因为指向const的指针存在意义就是不能改变指向对象的值,普通指针是可以随意改变所指对象的值得,而const数组不能被修改,两者建立起关系,这就矛盾了。

同样的也不应该把const数组作为实参传递给普通指针的形参中去!

3.不能改变所指对象的指针

前面讲到了不能改变所指对象的值得指针,那么也会存在不能改变所指对象(初始化后,这个指针只能指向最初的那个指定的量,不能指向其他),声明格式中,const的位置要注意:

int main() {
    int a[2] = {1, 2};
    int *const pi = a;
    pi++; //此时会报错,pi只能指向a的首元素地址,不能改变!
} 

4.创建一个值和对象均不可改变的指针(也是有意义的)

int a = 5;
const int *const pi = &a; //pi只能指向a,也不能改变a的值。
*pi+=1; //不合法!

小结

const是很有用的,目前主要起到降低我们在开发过程中的错误发生几率,保护程序运行过程中我们不需要修改的那些数据。