说起引用,相信大家都会和指针联想到一起,确实!引用和指针存在千丝万缕的关系。引用,可以看作是一个已经定义变量的别名,俩者虽然看起来有点差异,但是引用呢,他的底层实现其实也是用指针实现的。使用引用是为了方便我们程序员的编码实现,有助于阅读代码,而不用使用更复杂的指针,它在某些方面的应用可以说是比指针更加的“得心应手”。
引用与指针
现在来看看引用的定义:首先需要定义一个int类型的变量a,然后再定义一个与a同为int类型的变量c,加上引用符号&,把变量c指向已经定义好的变量a,如下:
int a = 666;
int& c = a;
cout << "c:" << c << endl;//666
引用有一个非常经典的用法,就是用作函数的参数。如果我们需要在外部交换俩个数的值,且经过函数的处理后,外部的值也发生了交换。在这里需要说明的一点是,普通的函数执行完之后,栈空间被释放,函数内部的局部变量也随之被销毁,所以根本不可能把函数外部的变量改变。图示。
那有什么解决方法呢?这里给出2种方式,1,使用指针,2,使用引用。
使用指针和引用都能达到同样的效果,但是使用引用,给我们视觉上的感觉是不是更友好一点?只需要行参使用引用,下面的交换实现和原来普通的函数一样,非常便于理解。但是使用指针,还需要对指针进行解引(使用*),看起来更加的眼花缭乱。引用在某些场合确实是比指针更加的灵活,以及实用性,可读性也更高,引用作为其他变量的别名而存在,在某些场合(比如这里)替代指针却是让我们程序员感觉更友好亲切。
//方式一, 使用指针
void swap1(int* a, int* b){
int tmp = *a;
*a = *b;
*b = tmp;
}
//方式二, 使用引用
void swap2(int& a, int& b){
int tmp = a;
a = b;
b = tmp;
}
说完了指针与引用,我们再来说说指针引用与二级指针。
指针引用与二级指针
在古代,婚姻大事都是父母之命,媒妁之言,俩个结婚的人只有在结婚当天才会见面,所以在结婚前关于对方的信息,都是媒婆在传达,假如我们写一个函数,让媒婆把男方的年龄进行传达,我们写一个要把男方年龄信息传达的函数。
有2种方式。1,使用二级指针。2,使用指针引用
可以看到,使用指针引用是更方便的,不需要通过解引(使用*),就可以直接使用,因此在很多时候,使用二级指针的地方可以使用指针引用来替代,增强使用性与可读性.
#include<iostream>
#include<Windows.h>
using namespace std;
//方式1,使用二级指针
//传进来的是一个一级指针地址,所以必须要用二级指针来接
void boy_home1(int** meipo) {
static int boy = 23;
//解引得到一级指针,可指向一个地址
*meipo = &boy;
}
//方式2,使用指针引用
//使用指针引用,使用起来更像是一个一级指针
void boy_home2(int*& meipo) {
static int boy = 23;
meipo = &boy;
}
int main(void) {
int x = 666;
int *p = &x;
//定义指针变量的引用
int* &q = p;
printf("*p: %d *q: %d\n", *p, *q);
//定义一个指针
int* meipo = NULL;
boy_home1(&meipo);
boy_home2(meipo);
printf("boy: %d\n", *meipo);
system("pause");
return 0;
}
今天的分享就到这里了~!