/*
1)引用作为其它变量的别名而存在,因此在一些场合可以代替指针
2)引用相对于指针来说具有更好的可读性和实用性
引用本质
1、单独使用引用时,必须初始化,说明很像一个常量
2、引用有地址,引用是常量 引用在C++中的内部实现是一个常指针
Type& name <==>Type* const name
3、C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同
*/
#if 1
struct Teacher
{
char name[64]; //64
int age; //4
int &a; //4 很像指针所占的内存空间的大小
int &b; //4 引用也占用内存空间
char &c; //4
};
/*引用
当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,
传给了形参引用(常量指针)
间接赋值成立的三个条件
1 定义两个变量 (一个实参一个形参)
2 建立关联 实参取地址传给形参 (引用,c++编译器帮程序员做了这步骤)
3 *p形参 去间接的修改 实参的值
// 123 写在一块 普通使用
// 12 3 函数的使用
// 1 23 引用
引用在实现上,只不过是把:间接赋值成立的三个条件的后两步和二为一
使用引用时:
当我们使用引用语法的时,我们不去关心编译器引用是怎么做的
当我们分析奇怪的语法现象的时,我们才去考虑c++编译器是怎么做的
*/
void modifyA(int &a1)
{
a1 = 100;
}
//引用c++编译器实际的动作
void modifyA2(int* const a1)
{
*a1 = 200;//*实参的地址 ,去间接的修改实参的值
}
void modifyA3(int *p)
{
*p = 300; //*p 3*p形参去间接修改实参的值
}
void test()
{
//单独定义引用时,必须初始化;说明很像一个常量
const int c1 = 10;
int a = 10;
int &b = a;
cout << "&a: " << &a << endl;
//引用有没有地址 即能不能给内存取别名
cout << "&b: " << &b << endl;//a b地址相同; a b均是同一块内存的门牌号
//引用占内存空间
cout << "sizeof(Teacher):" << sizeof(Teacher) << endl;//80
modifyA(a);//指向这个函数调用的时候,我们程序员不需要取a的地址
cout << "a: " << a << endl;
a = 10;
modifyA2(&a);//如果是指针 需要我们程序员手工的取实参的地址
cout << "a: " << a << endl;
int *p = NULL; //间接赋值成立的三个条件 1 定义两个变量
p = &a;
*p = 100;
{
*p = 200;
}
modifyA3(&a); //2 建立关联
cout << "a: " << a << endl;
}
#endif
10_引用本质探究
最新推荐文章于 2021-02-16 14:44:55 发布