浅析指针与const
2017-10-02 09:53
239 查看
* const用于指针有着一些微妙的地方,也有着比较复杂,短时间难以理解的地方,所以就此详细探讨一番。
让指针指向一个常量对象,这样可以防止使用该指针来修改所指向的值
*pt的值为const,对pt而言,这个值(age)是常量,但并不意味着它所指向的值就是一个常量,可以通过修改age变量来修改age的值。
这是将常规变量赋给const指针,那么再仔细一想,还有两种情况:
①. 将const变量赋给const指针
②. 将const变量赋给常规指针
为什么第二种情况无效?
显然,将const变量赋给常规指针,则可以使用pm来修改pi的值,这使得pi的const状态很荒谬,因此C++禁止这种操作。若非这样做不可,那么可以使用强制类型转换…
如果指针指向指针,那么情况将会更加复杂,例
上述将非const的地址(&pl)赋给const指针(pp2),而*pp2(p1)指向了n,因此可以使用pl来修改const数据,這显然是不合适的。在进入两级间接关系时,将const和非const混合的指针赋值方式是不安全的,所以仅当只有一层间接关系(指针指向基本数据类型)时,才可以将非const地址或指针赋给const指针。
常规指针不能指向const变量也意味着不能将const数组作为参数传递给使用非常量形参的函数,下述操作是不允许的:
将指针本身声明为常量,这样可以防止改变指针指向的位置
关键字const的位置与以前有所不同,这种声明格式使得pt只能指向age,但允许使用pt修改age的值。
还可以声明指向const对象的cons指针:
pm和*pm都是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。
相关文章推荐
- 浅析C++之指针和const限定符号
- 浅析const与指针的组合
- 浅析带const的指针或引用复杂声明
- C++指向const对象的指针和const指针
- const指针,指向const的指针,指向const的const指针 -- C
- 指向const对象的指针和const指针
- const修饰指针的用法
- const指针与指向const对象的指针
- C++中const用法浅析
- const和指针
- C++ 引用和指针 const与#define #define与内联函数
- 漫谈C指针第七讲---const int *pi 的语义
- C++ 指针与const的组合复习
- 浅谈C++ 之 const与指针关系
- 【C/C++学院】0820-Nullptr/const对象/类指针引用以及mallocfree与newde/类重载运算符/QT加法重载/类的重载赋值运算/自增在前在后差别/赋值重载深浅拷贝/重载下标
- C++中常函数内部的this指针也是const类型的
- C语言:浅析指针数组、数组指针、函数指针、函数指针数组、指向函数指针数组的指针
- C语言const,extern,static 浅析
- 指针释疑——const int *pi与int *const pi的区别(整理)
- const 指针与指向const的指针