C++学习:引用&

一、变量知识回顾

1、变量是一段连续存储空间的别名

2、程序通过变量来申请并命名存储空间;

3、可以通过变量的名字来使用存储空间;

那么问题来了,一段连续的存储空间是否可以有多个别名?

一个人可以有乳名,小名,正名,字,号,同理存储空间应该可以有多个别名,可以通过引用来解决。

二、引用----C++中新增加的概念

引用可以看做一个已定义变量的别名

//引用的语法
Type&  name  =  var;

引用在定义的时候必须用同类型的变量进行初始化;

程序实例1:引用的用法

#include<stdio.h>
int main()
{
	int a = 4; //定义并初始化变量a
	int& b = a;//通过引用,给变量a起个别名b,引用的类型要与原变量一致

	b = 5; //给b赋值就是给变量a赋值

	printf("a = %d\n", a); //a的值已经通过别名b改变为5
	printf("b = %d\n", b);//b的值已经赋值为5

	printf("&a = %d\n", &a); //打印a的地址
	printf("&b = %d\n", &b); //打印b的地址
    
    return 0;
}

输出结果:

a = 5
b = 5
&a = 13891840
&b = 13891840

结果分析:变量a的地址与变量b的地址是一样的,理应如此,毕竟鲁迅和周树人就是同一个人啊,a和b也是同一个东西。

三、引用的本质

3.1、引用作为变量的别名,在某些地方时可以代替指针

比如交换两个变量的值

程序实例2:通过指针交换两个变量的值

#include<stdio.h>

void swap(int* a, int* b)
{
	int t = *a;
	*a = *b;
	*b = t;
}

int main()
{
	int a = 4; 
	int b = 5;

	printf("a = %d\n", a);
	printf("b = %d\n", b);

	swap(&a,&b);
	printf("a = %d\n", a);
	printf("b = %d\n", b);

	return 0;
}

程序实例3:通过引用交换两个变量的值

#include<stdio.h>

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

int main()
{
	int a = 4;
	int b = 5;

	printf("a = %d\n", a);
	printf("b = %d\n", b);

	swap(a, b);
	printf("a = %d\n", a);
	printf("b = %d\n", b);

	return 0;
}

程序实例2和程序实例3都可以进行两个变量值的交换,用引用来交换变量的值,代码显得更简洁一些,使用起来更直观。

引用作为函数的形参时,不需要初始化。

3.2 const引用

在C++中可以声明const引用, const引用让变量拥有只读属性

const 引用语法

const Type& name = var;

程序实例5:const引用

#include<stdio.h>

int main()
{
	int a = 4;
	const int& b = a; //通过const引用,使变量a拥有只读属性

	int* p = (int*)&b;

	*p = 5; //只读常量不能直接修改值,但是可以通过指针来修改值

	printf("a = %d\n", a);
	printf("b = %d\n", b);

	return 0;
}

输出结果

a = 5
b = 5

当使用常量对const引用进行初始化的时候,C++编译器会给常量只分配空间,并将引用名作为这段空间的别名。使用常量对const引用初始化之后,将生成一个只读变量。

3.3、引用是否有自己的存储空间

我们知道引用是一个变量的别名,那它有自己的存储空间吗?

我们知道指针是有自己的存储空间的,引用又跟指针很相似,应该有自己的存储空间吧。

程序实例6:

#include<stdio.h>

struct Test
{
	char& r;
};

int main()
{
	char c = 'c';
	char& rc = c;
	Test ref = { c };

	printf("sizeof(char&) = %d\n", sizeof(char&)); //char类型的引用还是1个字节
	printf("sizeof(rc&) = %d\n", sizeof(rc)); //char引用的变量也是一个字节

	printf("sizeof(Test) = %d\n", sizeof(Test));//test结构体里面只有一个引用
	printf("sizeof(ref.r) = %d\n", sizeof(ref.r));//char类型的引用,是一个字节

	return 0;
}

输出结果:

sizeof(char&) = 1
sizeof(rc&) = 1
sizeof(Test) = 4
sizeof(ref.r) = 1

结果分析:

sizeof(Test) = 4占4个字节,指针也是4个字节。

3.4 引用的本质

引用在C++内部就是一个指针常量

Type& name;等效于 Type* const name;

C++编译器在编译过程中用指针常量作为引用的内部实现,引用所占的空间大小与指针式相同的;

在使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这个细节。

四、引用的意义

在C++中引用大多数情况下是为了代替指针;

可以满足多数需要使用指针的场合;

可以避开由于指针操作不当而带来的内存错误;

简单易用且功能强大。

猜你喜欢

转载自blog.csdn.net/m0_49968063/article/details/133484809