C++中 常量引用、指向常量的指针、常量指针的区别
C++中 常量引用、指向常量的指针、常量指针的区别
https://blog.csdn.net/Rueing839/article/details/48416907
先初步了解引用、指针的一些注意事项。
引用并非对象
引用必须初始化
引用只能绑定在对象上,而不能与字面值或某个表达式的计算结果绑定在一起
类型要严格匹配
- int &a = 10; //错误:引用类型的初始值必须是一个对象
- double a = 3.14;
- int &b = a; //错误:此处引用类型的初始值必须是int型对象
指针本身就是对象
指针的类型要和它指向的对象严格匹配
- double dval;
- double *pd = &dval; //正确
- double *pd2 = pd; //正确
- int *pi = pd; //错误:指针pi的类型和pd的类型不匹配
- pi = &dval; //错误:试图把double型对象的地址赋给int型指针
有例外:
引入const 限定符
常量引用
初始化常量引用时允许用任意表达式作为初始值
- int i = 42;
- const int &r1 = i; //正确:允许将const int & 绑定到一个普通int对象上
- const int &r2 = 42; //正确
- const int &r3 = r1 * 2; //正确
- int &r4 = r1 * 2; //错误
- double dval = 3.14;
- const int &ri = dval; //正确
- //等价于
- const int temp = dval;
- const int &ri = temp;
- int i = 42;
- int &r1 = i;
- const int &r2 = i;
- r1 = 0; //正确
- r2 = 0; //错误
指向常量的指针
- int i = 42;
- int &r1 = i;
- const int &r2 = i;
- r1 = 0; //正确
- r2 = 0; //错误
- const double p = 3.14;
- double*ptr = &p; //错误
- const double*cptr = &p; //正确
- *cptr = 42; //错误
- double dval = 3.14;
- const double*cptr = &dval;//正确
Tip:
所谓指向常量的指针或引用(即常量引用、指向常量的指针),不过是指针或引用“自以为是”罢了,它们觉得自己指向了常量,所以自觉地不去改变所指对象的值,但这些对象却可以通过其他途径改变。
常量指针
必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了。常量指针并不意味着不能通过指针修改其所指对象的值。
- int errNumb = 0;
- int *const curErr = &errNumb; //curErr将一直指向errNumb
- const double p = 3.14159;
- const double*const pip = &p; //由于是常量p,因而pip是一个指向常量对象的常量指针,将一直指向p
- *pip = 2.72; //错误:pip是一个指向常量的指针
- if (*curErr)
- {
- errorHandler();
- *curErr = 0; //正确:把curErr所指的对象的值重置
- }
版权
// constRef.cpp : Defines the entry point for the console application. // #include "stdafx.h" int main(int argc, char* argv[]) { printf("Hello World!\n"); { int i = 42; const int &r1 = i; //正确:允许将const int & 绑定到一个普通int对象上 const int &r2 = 42; //正确 const int &r3 = r1 * 2; //正确 //int &r4 = r1;//int &r4 = r1 * 2; //错误 printf("r1:%d\n",r1); i+=1; printf("r1:%d\n",r1); } { double dval = 3.14; const int &ri = dval; //正确 //等价于 //const int temp = dval; //const int &ri = temp; } { int i = 42; int &r1 = i; const int &r2 = i; printf("i:%d,r1:%d,r2:%d\n",i,r1,r2); r1 = 0; //正确 //r2 = 0; //错误 printf("i:%d,r1:%d,r2:%d\n",i,r1,r2); } /* Hello World! r1:42 r1:43 i:42,r1:42,r2:42 i:0,r1:0,r2:0 Press any key to continue */ return 0; }

浙公网安备 33010602011771号