变量名回顾
变量名实质上是一段连续存储空间的别名,是一个标号(门牌号)
程序中通过变量来申请并命名内存空间
通过变量的名字可以使用存储空间
问题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:引用的本质
#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;
}