1、变量是一段连续存储空间的别名;
2、程序通过变量来申请并命名存储空间;
3、可以通过变量的名字来使用存储空间;
那么问题来了,一段连续的存储空间是否可以有多个别名?
一个人可以有乳名,小名,正名,字,号,同理存储空间应该可以有多个别名,可以通过引用来解决。
引用可以看做一个已定义变量的别名
//引用的语法
Type& name = var;
引用在定义的时候必须用同类型的变量进行初始化;
程序实例1:引用的用法
#include
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也是同一个东西。
比如交换两个变量的值
程序实例2:通过指针交换两个变量的值
#include
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
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都可以进行两个变量值的交换,用引用来交换变量的值,代码显得更简洁一些,使用起来更直观。
引用作为函数的形参时,不需要初始化。
在C++中可以声明const引用, const引用让变量拥有只读属性
const 引用语法
const Type& name = var;
程序实例5:const引用
#include
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引用初始化之后,将生成一个只读变量。
我们知道引用是一个变量的别名,那它有自己的存储空间吗?
我们知道指针是有自己的存储空间的,引用又跟指针很相似,应该有自己的存储空间吧。
程序实例6:
#include
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个字节。
引用在C++内部就是一个指针常量
Type& name;等效于 Type* const name;
C++编译器在编译过程中用指针常量作为引用的内部实现,引用所占的空间大小与指针式相同的;
在使用的角度,引用只是一个别名,C++为了实用性而隐藏了引用的存储空间这个细节。
在C++中引用大多数情况下是为了代替指针;
可以满足多数需要使用指针的场合;
可以避开由于指针操作不当而带来的内存错误;
简单易用且功能强大。