您的位置:首页 > 其它

浅析指针与const

2017-10-02 09:53 239 查看
* const用于指针有着一些微妙的地方,也有着比较复杂,短时间难以理解的地方,所以就此详细探讨一番。

让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值

int age=39;
const int * pt = &age;


*pt的值为const,对pt而言,这个值(age)是常量,但并不意味着它所指向的值就是一个常量,可以通过修改age变量来修改age的值。

这是将常规变量赋给const指针,那么再仔细一想,还有两种情况:

①. 将const变量赋给const指针

const float pi = 3.14;
const float * p = π   //这显然有效


②. 将const变量赋给常规指针

const float pi =3.14;
float * pm= π   //无效


为什么第二种情况无效?

显然,将const变量赋给常规指针,则可以使用pm来修改pi的值,这使得pi的const状态很荒谬,因此C++禁止这种操作。若非这样做不可,那么可以使用强制类型转换…

如果指针指向指针,那么情况将会更加复杂,例

const int  ** pp2;
int * p1;
const int n = 13;
pp2 = &p1;
*pp2 = &n;
*p1 = 10;


上述将非const的地址(&pl)赋给const指针(pp2),而*pp2(p1)指向了n,因此可以使用pl来修改const数据,這显然是不合适的。在进入两级间接关系时,将const和非const混合的指针赋值方式是不安全的,所以仅当只有一层间接关系(指针指向基本数据类型)时,才可以将非const地址或指针赋给const指针。

常规指针不能指向const变量也意味着不能将const数组作为参数传递给使用非常量形参的函数,下述操作是不允许的:

const int num[5] = {1,2,3,4,5};
int sum(int arr[], int n){...}
int j = sum(num, 5);     //编译器将禁止这种函数调用


将指针本身声明为常量,这样可以防止改变指针指向的位置

int age = 39;
int * const pt = &age;  //另一个微妙之处


关键字const的位置与以前有所不同,这种声明格式使得pt只能指向age,但允许使用pt修改age的值。

还可以声明指向const对象的cons指针:

double pi = 3.14;
const double * const pm = π


pm和*pm都是const。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: