#include <iostream>
//#include <cstring>
using namespace std;
//1.引用没有定义,是一种关系型声明,声明它和某一变量(实体)的关系,因此类型与原类型保持一致
//且不分配内存,与被引用的变量有相同地址
//2.声明的时候必须初始化,一旦声明,不可变更
//3.可对引用进行再次引用,多次引用的结果,是某一变量具有多个别名
//4. &符号前有数据类型时为引用关系,其他皆为取址操作
//5. 研究引用 可将其作为常指针 编程使用时 将其理解为变量的别名
struct ta{
int *a;
};
struct tb{
int &a;
};
void changev(int *p){
*p=45;
}
void changev(int &p){ //将引用作为函数参数传递时,编译器将实参取地址给引用 &p = main::a
p=666; //赋值操作时,编译器隐藏了*取值 赋值操作 *p =666
}
int main(){
int a = 10;
int b = 50;
int *p = &a;
*p = 30;
cout<<"a: "<<a<<endl;
int &re = a;
int &re6 = re;//引用一定要初始化 类似于常量
re6 = 1000;
re = b;//re=50;只是将b的值赋给了re
cout<<"b: "<<&b<<endl;//b地址 00EFFDCC
cout<<"re: "<<&re<<endl;//a地址 00EFFDD8
cout<<"a: "<<a<<endl; //a:50
cout<<"p: "<<p<<endl; //00EFFDD8
cout<<"re: "<<&re<<endl;//00EFFDD8
cout<<"re6: "<<&re6<<endl;//00EFFDD8
cout << "--------------------" << endl;
cout<<"src a: "<<a<<endl; //50
changev(&a);
cout<<"a: "<<a<<endl; //45
changev(a);
cout<<"a: "<<a<<endl; //666
cout << "sizeof struct ta: " << sizeof(struct ta) << endl; //4
cout << "sizeof struct tb: " << sizeof(struct tb) << endl; //4 引用所占用的大小与指针相同
//引用必须初始化 引用可能是一个常指针
system("pause");
return 0;
}