C++引用

变量名:实质上是一段连续存储空间的别名,类似于门牌号;程序中通过变量来申请并命名内存空间,通过变量的名字来使用存储空间。

引用概念

  1. 引用是C++新增的概念
  2. 引用可以看作是一个已定义的变量的别名
  3. 引用语法:引用类型 &引用名 = 目标变量名;
  4. 引用是某一变量的别名,对引用操作与直接对变量操作等同
#include <stdio.h>
#include <Windows.h>

int main(){
	int a = 10;
	
	int &b = a;	// 定义了一个引用,并使用变量a初始化它
	//int &c;		// 定义引用必须初始化,否则会报错

	printf_s("a=%d, b=%d\n", a, b);	// 结果:a=10, b=10
	
	system("pause");
	return 0;
}

引用是C++的概念

使用.c文件能否通过?

#include <stdio.h>
#include <Windows.h>

int main(){
	int a = 10;
	int &b = a;	// 编译报错

	system("pause");
	return 0;
}

引用做函数参数

普通引用在声明时必须用其他变量做初始化,引用做函数参数声明时无需初始化。

#include <stdio.h>
#include <Windows.h>

void swap(int &a, int &b) {
	int tmp = a;
	a = b;
	b = tmp;
}

int main(){
	int a = 10;
	int b = 100;

	printf_s("调用swap函数前,a = %d, b = %d\n", a, b);

	swap(a, b);
	printf_s("调用swap函数后,a = %d, b = %d\n", a, b);

	system("pause");
	return 0;
}

引用的意义

  1. 引用作为其他变量的别名存在,因此在一些场合可以代替指针
  2. 引用相对于指针来说有更好的可读性和实用性
// swap和swap1效果等同,swap可读性和实用性更高
void swap(int &a, int &b) {
	int tmp = a;
	a = b;
	b = tmp;
}

void swap1(int *a, int *b){
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

引用的本质

  1. 引用在C++的内部实现是一个常指针
    引用类型 &引用名 <=>类型 const *指针变量名

  2. C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。

  3. 从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏

引用结论

  1. 当实参传值给形参引用的时候,只不过是C++编译器帮我们手动取了一个实参地址,传给了形参引用(常量指针)

  2. 当我们使用引用语法时,无需考虑C++编译器引用是怎么做的;只有当我们分析奇怪的语法现象时,我们才去考虑C++编译器时怎么做的。

指针引用

#include <stdio.h>
#include <Windows.h>


void test1(int **A) {
	static int age = 10;

	*A = &age;
}

void test2(int *&A) {
	static int age = 15;

	A = &age;
}

int main(){
	int *age = nullptr;

	//test1(&age);
	test2(age);
	printf_s("age:%d\n", *age);

	system("pause");
	return 0;
}

以上代码分析:test1 和 test2效果相同,但是test2可读性和实用性更高。

常引用(const引用)

定义方法:const 引用类型 &引用类型名 = 另一变量;

用变量初始化常引用

这种是让变量引用变成只读,不能通过引用对变量的值进行修改

#include <stdio.h>
#include <Windows.h>

int main(){
	int a = 10;
	const int &b = a;

	system("pause");
	return 0;
}

用常量初始化常引用

在C++中,编译器会对这样定义的引用分配内存,这算是个特例!

#include <stdio.h>
#include <Windows.h>

int main(){
	const int a = 10;
	const int &b = a;

	system("pause");
	return 0;
}

const引用结论

  1. const &int a 相当于 const int *const a
  2. 普通引用相当于 int *const a
  3. 当时有常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段内存的别名
  4. 使用常量对const引用初始化后,将生成一个只读变量
    湖南奇牛信息科技
    奇牛学院_佳人学院链接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值