【C/C++指针】指针*与引用的区别
- 指针变量的值是所指对象的地址(准确说是首地址,其类型定义其所指对象的字节长度)
- 引用变量的值是所引用对象本身的值
1 初始化
- 指针变量 可不初始化 且 可以更换指向对象
int *p;//此时是个野指针,该指针变量的值是任意值,不指向任何对象
//---//
int a = 4, b = 5;
int* p = &a;//分为两步:int* p, p = &a
//指针变量所指对象可变(即指针变量的值若没有const的限制是可以变化的)
int a = 4, b = 5;
int *p;//让其暂时做野指针
p = &a;
p = &b;//先指向对象a,再修改为指向对象b
- 而引用变量 要且必须要初始化,但也可以改变引用对象
int& r;//错误:未初始化引用
//---//
int a = 4;
int& r = a;
int a = 4, b = 5;
int& r = a;
r = b;//引用对象改变
2 级间的独立性
- 指针可以有 一级指针,二级指针,甚至更多级指针,每级指针变量被存放在不同的地址上(即 &p 得到的值不同)
int a = 4;
int* p1 = &a;//一级指针:指向对象为整形变量a
int** p2 = &p1;//二级指针:指向对象为指针变量p1,即一级指针
cout << **p2;//对二级指针两次解引用得到整形数据
- 引用会折叠多级引用
引用声明-cppreference
typedef int& lref;
typedef int&& rref;
int n;
lref& r1 = n; // type of r1 is int&
lref&& r2 = n; // type of r2 is int&
rref& r3 = n; // type of r3 is int&
rref&& r4 = 1; // type of r4 is int&&
- 可以创建指向指针的指针,但不能创建指向引用的指针
int&* p2r;//Error
3 数组
- 可以创建指针数组
int *ap[]; // OK, array of pointers
- 但不能创建引用数组
int &ar[]; // ill-formed, array of references
参考blog(platform:Stack Overflow):指针变量和引用变量之间有什么区别?
拓展blog:【C语言精髓之指针】结构体指针(->与.两个运算符的区别)