案例升级:
int b = 1;
int c = 2;
int & i = b;
i = c;
int *p = &b;
p = &c;
p = &i; //&,将打破引用变量的同名,不同的地址,取得是原来引用变量的地址
在我学习上学的时候认为b就是一个变量,就是一个内存中一个单元,这个并没有什么错误.
但是这个变量的范围有什么决定呢?由int形这个编译器关键字决定的,其范围为0-FFFFFFFF的范围:(这里将int形看成4字节)
1值范围
我们的指针变量 呢?其实它的值也是在这个范围,但是我们一般给指针变量的值非常的大,原因就是编译器给变量的地址很大,于是我们的指针变量的值很大,引用变量同指针变量内存同指针,但是他是写死的。
2 引用变量
引用变量i还是那个内存变量,但是我们给它语义是不一样的,(就是编译它的指令不一样),int & 的变量,编译器的时候变量与另外一个变量的关系完成,这种关系就是固定的,是一中同生共死的关系,不会改变关联关系,于是我们就用int &的变量名来代贴*p,隐藏了变量的真实内存,直接用目的变量内存来表示,导致了同一个变量名,但是不同的内存(初始化的时候,变量名代表的是变量的真实地址,其他操作中基本上是,变量名代表的是引用变量A内存指向变量B的内存,《变量名代表的是变量B的内存》,但是&引用变量名,将打破这一关系,&引用变量名取得是引用变量A内存的地址),这些事C++中最坑之一处,导致后面重载一系列的问题,
3指针
- 指针变量就是内存变量,我们给他的编译指令跟普通的变量是不一样的,int 的变量,编译器的时候变量与另外一个变量的关系完成,但是这种关系不是固定的,于是我们出现了int 变量就是实际的内存,我们并没有隐藏,而是将真正将指针变量露了出来