c++ 学习之 引用

c++ 学习之 引用

前言

当我们需要在函数内部对外部变量进行改变值操作时,必须要传递实参。我们最常见的作法就是传递一个指向该变量地址的指针,但是指针操作,往往让很多小伙伴很头疼,那么接下来给大家介绍一下可以实现同样功能而且更加方便的的操作 引用

正文

什么是引用

引用变量是一个变量的别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。其实当你定义一个变量的时候,就相当于给一块内存地址起了一个名字,我们可以通过变量名来找到这块内存地址。那么定义引用呢,就相当于给了这块内存地址又起了个名字,通过引用同样可以找到这块内存地址。就像你生下来身份证上要有一个名字,你的父母又给你起了一个小名,两个名字都是你一样。

定义一个引用

那么如何定义一个引用呢? 就是在你正常定义变量的形式上在变量名前加一个&。话不多说,上代码。

	int a =1;
	int &b =a;
	printf("%d %d %p %p",a,b,&a,&b);

输出结果:1 1 0095FAD0 0095FAD0
可以看到此时,a与b的地址是同一个地址,这也印证了我上文的话。
值得注意的是,当你定义一个引用的时候,必须要用已有的变量对其进行初始化!!!!

引用与typedef的区别

上文说到,引用就是对变量起一个别名,听到别名,我们的第一 反应就是typedef。同样是起别名,typedef与引用时有本质上区别的。typedef是对于类型起的别名,比如说对 int,float了,char类型起别名。而引用是对于变量起别名,比如,你已定义过一个整型变量叫a,那么此刻,就可以用引用对这个变量a起别名。 其实引用也是一种类型,可以用typedef对相应的引用类型起别名。

typedef int& p
{
	  int a = 1;
	  p b = a;
	  printf("%d %d %p %p\n",a,b,&a,&b);
  
}

引用与指针的区别

1.定义引用时必须要用一个已有变量去初始化,而指针可以在任何时间被初始化。同样的,引用时不可以为空的,但是可以有空的指针。
2.一旦引用初始化后,就不可以赋值给别的变量,而指针可以改变其指向的空间。

引用的实质

引用的实质其实是常量指针的使用,只不过c++编译器在内部进行了实现。

	int a =1;
	int &b =a;
	int * const c = &a;
	

这个第二行代码和第三行代码其实是一样,引用底层的实现就是第三行那样。从 const 就可以看出,为什么当引用指向一个变量后,就不可以改变指向其他变量了。

引用的应用

在函数参数中的应用。

void Swap(int a,int b)
{
	  int temp =a;
	  a = b;
	  b = temp;
}

这样的函数是无法对外面的两个变量进行值交换的,因为这种函数传递的是形参,本质是值传递,只是对其值进行了拷贝,实际上到了函数内部,就变成了另外两个栈区变量了,当函数运行结束,这两个变量的作用域结束,就会被操作系统释放掉。想要真正的实现功能,是必须要传递实参的,有两种方法。
1.指针参数

void Swap(int *a,int *b)
{
	 int temp = *a;
	 *a = *b;
	 *b =temp;
}

这样的就是传入两个变量的地址,通过变量的地址进行间接引用来操纵地址指向的内容。

扫描二维码关注公众号,回复: 10372310 查看本文章

2.引用参数

void Swap(int &a,int &b)
{
	 int temp =a;
	 a = b;  
         b = temp;
}

这样传入的就是两个变量的引用,可以直接对相应地址上的内容进行操作,比起指针,这样的确方便了很多。
其实这样的函数传参方式也可以写成这样:

void Swap(int *const a,int *const b)
{
	 int temp = *a;
	  *a = *b;
	  *b =temp;
}

这个东西知道就好,只是更好的帮你理解引用,没必要真的用这个代替引用。

发布了10 篇原创文章 · 获赞 6 · 访问量 417

猜你喜欢

转载自blog.csdn.net/weixin_45074185/article/details/104354058
今日推荐