C++ | 引用是什么意思?引用与指针的不同点?详细讲解

发布时间:2024年01月24日

引用

引用概念

引用,就是给已经存在的变量取别名

编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。

例如:李逵,AKA“铁牛”“黑旋风”,都是同一个人

引用语法

类型& 引用变量名(对象名)=引用实体

引用类型必须和引用实体是同种类型的;

int main()
{
	int a = 10;
	int& ra = a;
	printf("%p\n", &a);
	printf("%p\n", &ra);

	return 0;
}

?

引用特性

  1. 引用在定义时必须初始化;
  2. 一个变量可以有多个引用;
  3. 引用一旦引用一个实体,再不能引用其他实体;

错误写法:

常引用

常引用引用变量

先初始化变量,再const引用 常量

using namespace std;

int main()
{
	//(1)变量初始化,再const引用 变量
	int b = 10;
	const int& a = b;
	b = 11;//b是可以修改的,但是a不能修改
	printf("a=%d,b=%d\n", a, b);
	return 0;
}

常引用引用常量

const引用常量

using namespace std;

int main()
{
	//(2)const引用 常量
	const int& c = 15;
	//编译器会给常量15开辟一片内存
	//并将引用名作为这片内存的别名
	//int &d=15//err
	cout << c << endl;
	return 0;
}

引用使用场景

做参数
using namespace std;
void Swap1(int* a, int* b)
//传值
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

void Swap2(int& a, int& b)
//传引用
{
	int temp = a;
	a = b;
	b = temp;
}

int main()
{
	int a = 23; int b = 45;
	cout << "传值:" << endl;
	cout << "a = " << a << "  " << "b = " << b << endl;
	Swap1(&a, &b);
	cout << "a = " << a <<"  " << "b = "  << b << endl;
	
	int c = 66; int d = 99;
	cout << "传引用:" << endl;
	cout << "c = " << c << "  " << "d = " << d << endl;
	Swap2(c, d);
	cout << "c = " << c << "  " << "d = " << d << endl;
	
	return 0;
}

做返回值

如果函数返回时,出了函数作用域:

如果返回对象还在(还没有还给系统,eg:static),则就可以使用引用返回;

如果已经还给了系统,必须使用传值返回。

int& Count()
{
	static int n = 0;
	n++;
	// ...
	return n;
}

int main()
{
	int n = Count();
	cout << "n is :" << n << endl;
	return 0;
}

?

using namespace std;

int& Add(int a, int b)
{
	int c = a + b;
	return c;
}
int main()
{
	int& ret = Add(1, 2);
	cout << "Add(1, 2) is :" << ret << endl;
	int& ret2 = Add(3, 4);
	cout << "Add(3, 4) is :" << ret2 << endl;
	return 0;
}

参数&&返回值:值or引用

以值作为参数或者返回类型时:

在传参和返回期间,函数不会直接传递实参或者变量本身直接返回,而是传递实参或者返回变量的一份临时拷贝,因此此时效率是低下的,尤其是参数或者返回类型非常大时。

引用和指针的区别

语法概念上,引用就是一个别名,没有独立空间,和其他引用实体公用同一块空间;

底层实现上,引用实际是有空间的,因为引用是按照指针方式来实现的。

引用和指针的不同点
  1. 引用是一个变量的别名,指针存储的是一个变量的地址;
  2. 引用在定义时必须初始化,指针没有要求;
  3. 引用在初始化引用一个实体之后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型实体;
  4. 没有NULL引用,但是有NULL指针;
  5. 在sizeof中,引用结果是引用类型的大小,但指针始终都是地址空间占用字节个数(32位平台下占用4个字节);
  6. 引用+1即引用的实体+1,指针+1即指针向后偏一个类型大小;
  7. 有多级指针,没有多级引用;
  8. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理;
  9. 引用比指针使用起来相对安全。
文章来源:https://blog.csdn.net/2301_78131481/article/details/135831133
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。