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