五:引用基础知识

变量名回顾

变量名实质上是一段连续存储空间的别名,是一个标号(门牌号)

程序中通过变量来申请并命名内存空间  

通过变量的名字可以使用存储空间

问题1:对一段连续的内存空间只能取一个别名吗?

             不是还以可以再起一个别名b


1 引用概念

a)        在C++中新增加了引用的概念

b)        引用可以看作一个已定义变量的别名

c)        引用的语法:Type& name = var;

d)    引用做函数参数那?(引用作为函数参数声明时不进行初始化)

#include<iostream>
using namespace std;


//引用概念
//属于C++编译器对C的扩展
int main01()
{
	int a = 10;
	//引用的语法:Type& name = var; 
	int &b = a;//请不要用C的语法考虑 b=11

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

	b = 100;//B就是A;A就是B;

	printf("b:%d\n",b);
	printf("a:%d\n",a);
	system("pause");
	return 0;
}

//复杂数据类型的引用

#include<iostream>
using namespace std;

//复杂数据类型的引用

struct Teacher
{
	char name[64];
	int age;
};

void printfT1(Teacher *pT)
{
	cout << pT->age <<endl;//因为是指针所以用了“->”
}
//pT是别名就会修改了
void printfT2(Teacher &pT)
{
	cout << pT.age <<endl;//pT就是t1,t1是元素就要用  “.”
	//pT.age = 33;//别名真的就会修改
}
//pT就是t1是两个不同的变量
void printfT3(Teacher pT)//pT就是t1,t1是元素就要用  “.”
{
	cout << pT.age <<endl;
	pT.age = 45;
}

int main()
{
	Teacher t1;
	t1.age =20;

	printfT1(&t1);

	printfT2(t1);//是引用就不需要取地址了--pT就是t1的别名
	//printf("t1.age:%d\n",t1.age);//pT是别名就会修改了


	printfT3(t1);//pT是形参,拷贝一份数据给pt,相当于执行了pT=t1;(不同参数传递,实参形参的关系)
	printf("t1.age:%d",t1.age);//打印的是20 ,pT.age = 45;没关系的

	system("pause");
	return 0;
}

2:引用的意义

//1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
//2)引用相对于指针来说具有更好的可读性和实用性

例如在进行交换数据的时候

int myswap01(int *a,int *b)//指针交换
{
	int c = 0;
	c = *a;
	*a = *b;
	*b = c;
	return 0;
}

int myswap02(int &a,int &b)//引用交换
{
	//这里的引用做函数参数不需要初始化   myswap02(int &a,int &b)
	int c = 0;
	c = a;
	a = b;
	b = c;
	return 0;
}

3:引用的本质


//01:第一点-->>单独定义的引用时,必须初始化;说明很像一个常量;

#include<iostream>
using namespace std;
//01:第一点-->>单独定义的引用时,必须初始化;说明很像一个常量;
int main()
{
	//const int c1 ;必须初始化---这个常量必须初始化
	int a = 10;
	int &b = a;//b很像一个常量
	//单独定义的引用时,必须初始化;说明很像一个常量 const int c1 = 10;
	//b是a的别名,请问c++编译器后面做了什么工作?
	b = 11;
	cout<<"b--->"<<a<<endl;
	printf("a:%d\n", a);
	printf("b:%d\n", b);
	printf("&a:%d\n", &a);
	printf("&b:%d\n", &b);  //请思考:对同一内存空间可以取好几个名字吗?
							//A,B都是同一个内存空间的门牌号
	system("pause");
	return 0;
}

a 和 b地址相同是同一个内存空间

//第二点:普通引用有自己的空间和指针的内存空间一样

#include<iostream>
using namespace std;
struct Teacher
{
	char name[64];//64
	int age;//4
	//很像指针占用的内存空间
	int &a;//如果引用占有内存空间就占4个字节没有就是0个字节
	int &b;//同上
};
//第二点:普通引用有自己的空间和指针的内存空间一样
int main()
{
	
	printf("sizeof(Teacher):%d\n",sizeof(Teacher));// 如果占有自己的内存空间输出就是76
	system("pause");
	return 0;
}


#include<iostream>
using namespace std;
//引用时c++编译器做了哪些工作

//引用在C++中的内部实现是一个常指针
//Type& name Type* const name
void modifyA(int &a1)
{
	a1 = 100;
}
//执行的本质是:下边的这个程序
void modifyA2 (int *const a1)
{
	*a1 = 200;//实参的地址,去间接的修改
}
//引用的本质
int main()
{
	int a = 10;

	modifyA(a);//执行这个函数调用的时候,程序员不需要取A地址
	printf("a:%d\n",a);
	
	 a = 10;
	modifyA2(&a);//如果是指针,需要程序员手工取实参的地址
	printf("a:%d\n",a);


	system("pause");
	return 0;
}


发布了33 篇原创文章 · 获赞 2 · 访问量 8543

猜你喜欢

转载自blog.csdn.net/QQ960054653/article/details/54691305