#include<iostream>
using namespace std;
//1.单独的引用,必须初始化,说明很像一个常量。
int maine(){
int a=10;
int &b=a;//1、引用变量也相当于一个门牌号。一个内存空间有多个门牌号
cout<<&a<<endl; //a 和 b 是同一块内存空间的门牌号
cout<<&b<<endl; //它们的值,相等的指向同一个内存空间。
system("pause");
}
/*
*2、普通引用类型占用的内存空间。 4个字节
*/
struct teacher
{
int age;
char name[20];
int &a; //引用类型是占用内存四个字节
};
int maing(){
cout<<"sizeof(teacher)"<<sizeof(teacher)<<endl;
}
/**
* @brief main
* @return
* 引用的本质:1.它是一个指针常量,相当于 int & a 相当于 int * const a;
*
* 2、因为在c++在编译时,引用的内部实现是指针常量,所以指针所占用的内存大小和指针占用的内存大小相同。
*
*3、在使用者的角度。引用会让人误认为一个别名,不会占用内存空间。这个是c++为了实用性,做的细节隐藏。
*
*
*/
void p(int & a){ //相当于后面的函数、
a=6;
}
void p2(int * const a){
*a=100;
}
int mainh(){
int a=10;
p(a); //引用的调用,不需要函数的地址
cout<<"a="<<a<<endl;
p2(&a);//指针函数的调用,需要函数的地址
cout<<"a="<<a<<endl;
}
void p3(int * a){
*a=100; //3、修改数据
}
/**
* @brief main
* @return
* 1、间接赋值的是三个条件。
* (1)、定义两个变量(一个实参,一个行参)
* (2)、建立关联。(实参取地址传递给形参)
* (3)、行参间接的去修改实参的值。
* (4)、引用在实现上,只是把间接赋值的后面两个条件和二为一。
*/
int main(){
int a=10;
int *p=null; //1、定义两个变量
p3(&a); //2、建立关联。
p=&a; //2、建立关联。
*p=20; //3、修改数据
}
引用的本质是:是把间接赋值的三个条件合二为一,给实参传给形参引用的时候,只不过c++编译器帮我们把形参取了一个地址,传递给形参的引用相当于(指针常量) int & a 相当于 int * const a;