const、指针、引用的综合
目录
代码段
定义引用变量的技巧
内存某处
正误判定技巧
温故知新
代码段
定义引用变量的技巧
// 定义引用变量的技巧#include<iostream>
using namespace std;int main()
{int a = 1;int * p = &a;// 首先,定义一个指针变量int * * q1 = &p;// 然后,将&符号移动到*符号的位置,覆盖*符号int * & q2 = p;// int * * q1 = &p; => int * & q2 = p;// 按照这种方式,最终q2是一个引用变量return 0;
}
内存某处
// 内存某处#include<iostream>
using namespace std;int main()
{// 内存0x0018ff56处int * p1 = (int *)0x0018ff56; // 正确写法1int * && p2 = (int *)0x0018ff56; // 正确写法2int * const & p3 = (int *)0x0018ff56; // 正确写法3// const int * & p4 = (int *)0x0018ff56; // 错误写法return 0;
}
正误判定技巧
// 正误判定技巧#include<iostream>
using namespace std;int main()
{int a = 1;int * p = &a;// const int * & q = p; // 错误!// 将const int * & q = p;还原成const int * * q = &p;// 因为const int * * <= int * *是错误转换// 所以const int * & q = p;错误!return 0;
}
温故知新
1、注意理解正确转换和错误转换!具体可参考文章const和指针的结合中的正误转换
2、如果const右边没有指针*,那么const不参与类型
// 1
int a = 1;
int * p = &a;
// int * <= int *,正确!
int * & q = p;
// 将int * & q = p;还原成int * * q = &p;
// int * * <= int * *,正确!// 2
int a = 1;
int * const p = &a;
// int * <= int *,正确!
int * & q = p;
// 判定方法1
// 将int * & q = p;还原成int * * q = &p;
// int * * <= int * const *,错误!
// 判定方法2
// 将int * & q = p;还原成int * * q = &p;
// int * * q = &p;代表将常量p的地址泄露给普通指针q
// 那么,通过q解引用就有将常量p修改的风险,所以错误!// 3
int a = 1;
const int * p = &a;
// const int * <= int *,正确!
int * & q = p;
// 将int * & q = p;还原成int * * q = &p;
// int * * <= const int * *,错误!// 4
int a = 1;
int * p = &a;
// int * <= int *,正确!
const int * & q = p;
// 将const int * & q = p;还原成const int * * q = &p;
// const int * * <= int * *,错误!