学习《C Primer Plus》---指针常量与常量指针

来源:互联网 发布:淘宝小工具 编辑:程序博客网 时间:2024/04/29 09:18

一,指针常量

指向常量的指针不能用于修改数值,考虑下列代码:

int rates[5] = {1,2,3,4,5};  const int * pd = rates;    //pd指向数组开始处

第二行代码把pd声明为指向const int 的指针。这样,就不可以使用pd来修改它所指向的数值。

* pd = 10;        //不允许 pd[2] = 20;      //不允许 rates[0] = 100;  //允许,因为rates不是常量 

无论是采用指针符号还是数组符号,都不能使用pd修改所指向数据的值。但请注意因为rates并没有声明为常量,所以仍可以使用rates来修改其数值。另外,还可以让pd指向其他地址:

pd++;       //让pd指向rates[1],这是允许的

通常把指向常量的指针用作函数参量,以表明函数不会用这个指针来修改数据。

二,常量指针

用关键字const来声明并初始化指针,以保证指针不会指向别处:

int rates[5] = {1,2,3,4,5};  int * const pc = rates;  pc = &rates[2];                 //不允许  *pc = 10;                      //可以,更改rates[0]的值

这样的指针仍然可用于修改数据,但它只能指向最初赋给它的地址。

三,指向常量的常量指针

int rates[5] = {1,2,3,4,5};  const int *const pc = rates;  pc = &rates[2];          //不允许  *pc = 20;               //不允许


四,关于指针赋值和const有一些规则需要注意。首先,将常量或非常量数据的地址赋给指向常量的指针是合法的:

int rates[5] = {1,2,3,4,5};  const int locked[4] = {11,22,33,44};  const int * pc = rates;               //合法  pc = locked;                          //合法  pc = &rates[3];                       //合法 

然而,只有非常量数据的地址才可以赋给普通的指针:

int rates[5] = {1,2,3,4,5};  const int locked[4] = {11,22,33,44};  int * pnc = rates;             //合法  pnc = locked;                  //非法  pnc = &rates[3];               //合法 

这样的规则是合理的。否则,你就可以使用指针来修改被认为是常量的数据。

原创粉丝点击