首先要明确的是指针也是一个变量,会在内存中开辟出新的空间。
而引用则是原变量的一个别名,跟原变量实质上是一个东西。
我们根据这张较为简陋的内存图来分析一下
需要注意的是&在不同地方表示的意义不同,在指针赋值时表示取变量地址,在引用中就表示给变量起别名。
int *p = &a; //表示的是a的地址由指针类型变量p来保存,通过*p解引用就能取到a的值
int q = *p; // q的值为10
int &b = a;// 给a起一个别名b,b和a表示的内容相同,此时打印b的值为10
int c = b; //b不用解引用直接就可以进行赋值,此时c的值为10
由于引用不会开辟新的空间,通常会用作形参节省空间
我们用值传递的方法写一个交换俩个变量的值的函数
void swap(int a, int b) {
int temp = a;
b = a;
b = temp;
}
由于值传递是新创建变量进行交换不会对原变量上的值进行修改,所以达不到我们想要的交换的效果
这时我们就可以用引用传递
void swap(int& a, int& b) {
int temp = a;
b = a;
b = temp;
}
引用传递传入实参后能直接在原变量上进行修改,就能达到俩个变量的值进行交换的效果。
我们知道指针大致可分为指针常量和常量指针;
指针常量:int * const p = &a 用 const 修饰 p,p是存放地址的,所以p存放的地址值也就是指针的指向不能改变,但是*p 也就是a的值是可以改变的
常量指针:int const* p = &a 用const 修饰*p,*p是变量a的值,所以*p的值不能修改,但是指针的指向可以改变
引用的本质:引用实际上是一个特殊的指针,我们叫指针常量
我们知道被const定义的变量就不能进行修改了,指针常量就是用const来修饰指针
int& b = a; 相当于 int * const b = &b,并且赋值时编译器会自动进行解引用操作
int c = b; 相当于int c = *b.
有错漏的地方欢迎大家指出交流