//引用的意义:
/*(1):引用作为其他变量的别名而存在,因此可以在一些场合可以替代指针。
int swap1(int &a,int &b) int swap2(int *a,int *b)
{ {
int t=a; int t=*a;
a=b; *a=*b;
b=t; *b=t;
return 0; return 0;
} }*/
//(2):引用相对于指针来说具有更好的可持续性和实用性
//引用本质思考:
//思考一:C++编译器在背后做了什么工作
#include<iostream>
using namespace std;
//1::单独定义引用时,必须初始化,说明很像一个常量。
int main01()
{
//const int c1;//单独定义时候必须初始化
int a=10;
int &b=a;//从这一点来讲B很像一个常量。
printf("a:%d\n",a);
printf("b:%d\n",b);
printf("&a:%d\n",&a);
printf("&b:%d\n",&b); //==>说明a和b就是同一块内存空间的门牌号
cout<<"hello"<<endl;
return 0;
}
//2:请问下面结构体有没有分配内存?也就是问普通引用有自己的内存空间吗?
struct teacher
{
char name[64];
int age;
int &a;
int &b;
};
int main02()
{
printf("sizeof(teacher):%d\n",sizeof(teacher)); //得出的结果是88,意思就是int &a和int &b都占了8个内存、
cout<<"hello"<<endl;
return 0;
}
/*3:引用的本质:
(1):引用在 C++的内部实现是一个指针 ,type &name<==>type *const name
void func(int &a) void func(int *const a)
{ {
a=5; *a=5;
} }
(2):C++编译器在编译过程中使用常指针作为引用的内部实现,因此信用所占用的内存空间大小与指针相同。
(3):从使用的角度引用会让人误会只是一个别名,没有自己的存储空间,合适C++为了实用性而做出的细节隐藏 。 */
void modify1(int &a1)
{
a1=100;
}
void modify2(int * const a1)
{
*a1=200;//*实参的地址,去间接的修改实参的值。
}
int main03()
{
int a=10;
modify1(a);//指向这个函数调用的时候,我们程序员不需要取a的地址,C++编译器已经给我们取好了。
a=10;
modify2(&a);//如果是指针,需要我们程序员手工的取实参的地址。
cout<<"hello"<<endl;
return 0;
}
/*间接赋值(*p)成立的三个条件:
(a)定义两个变量,(通常一个形参,一个实参)
(b)建立关系,实参取地址赋给形参指针。
(c)*p形参去简介修改实参的值*/
void modify3()
{
*p=200;//3:间接修改实参的值
}
int main()
{
int a=10;
int *p=NULL;//1:定义两个变量。
p=&a;
*p=100;
modify3(&a);//2:建立关联
cout<<"hello"<<endl;
}
//可以123放在一个函数,可以12放在一个,3独放在一个,就是函数,可以1放在一个23放在一个,这就是引用。
/*引用结论:
(1)引用在实现上,只不过是吧,间接赋值成立的三个条件的后两步合二为一。
当实参传给形参引用的时候,只不过是C++编译器帮我们程序员手工的取了一个实参的地址,传给了形参引用(常量指针)
(2)当我们使用引用的语法的时候,我们不去关心编译器引用是怎么做的,
当我们分析奇怪的语法现象的时候,我们才去考虑C++编译器是怎么做的。
引用 的本质探究
最新推荐文章于 2020-12-25 10:53:15 发布