引用与指针区别


 只读指针反汇编

引用操作反汇编

#include <iostream>

using namespace std;

void add(int *const nVar)

{

(*nVar) ++;

  //mov         eax,dword ptr [nVar]  

  //mov         ecx,dword ptr [eax]  

  //add         ecx,1  

  //mov         edx,dword ptr [nVar]  

  //mov         dword ptr [edx],ecx 

}

int main()

{

int nVar = 1024;

//mov        dword ptr [nVar],400h  

int *const nvarType = &nVar;

//lea         eax,[nVar]  

    //mov        dword ptr [nvarType],eax

int b = *nvarType;

//mov        eax,dword ptr [nvarType]  

  //mov         ecx,dword ptr [eax]  

  //mov         dword ptr [b],ecx 

add(&nVar);

return 0;

}

#include <iostream>

using namespace std;

 void add(int &nVar)

 {

 nVar++;

  //mov         eax,dword ptr [nVar]  

  //mov         ecx,dword ptr [eax]  

  //add         ecx,1  

  //mov         edx,dword ptr [nVar]  

  //mov         dword ptr [edx],ecx 

 }

int main()

{

int nVar = 1024;

//mov        dword ptr [nVar],400h  

int &nvarType = nVar;

//lea         eax,[nVar]  

    //mov        dword ptr [nvarType],eax

int b = nvarType;

//mov        eax,dword ptr [nvarType]  

   //mov         ecx,dword ptr [eax]  

   //mov         dword ptr [b],ecx 

add(nVar);

return 0;

}

引用类型本质:c++为了简化操作将指针类型进行了封装,只不过为了让c++语言容错机制更强,将指针封装成只读指针,即加上const修饰符修饰,从而产生了引用。

引用与指针区别从内存操作来说:引用类型变量的内存空间对使用者来说是隐藏的,与对象(可对内存读和写)相比只能进行读内存操作,而不能写操作。非常量指针可以进行读写操作,常量指针也可以只进行读操作。

引用与指针区别从初始化来说:为了避免指针指向无效或者非法的对象,引入了nullptr,使得只要指针一创建就要被初始化为nullptr,防止解引用无效的指针,但是引用避免了这个问题,因为引用必须初始化,并且一旦初始化后,引用变量和变量将始终绑定在一起

引用与指针区别从指向对象上来说:指针是“指向”某个对象,言外之意在作用域内指针可以任意改变指向的对象,所以在解引用时,可能访问无效的指针,或者指向nullptr指针或者指向紧邻对象所占空间的下一个指针。但是引用是“绑定到”某个对象,所以一旦定义就不会改变指向的对象。在使用上也就避免了很多问题。

引用与指针区别使用上来说:引用通过编译器自动实现寻址,而指针要手动加 寻址。这也就避免了程序员在使用指针类型时忘记加*。

引用与指针区别其常量类型上说:但是对于指针类型不能指向常量,同时也不能指向与之不同类型但能隐式转化的变量,即使是常量指针即使是能指向常量,但是不能指向与之不同类型但能隐式转化的变量。而常量引用类型可以(注意只能是常量引用),这同时也揭露出引用的本质是一个指针,只不过将常量先保存在一个临时变量中,然后让这个引用指向他而已。

引用与指针区别复合类型声明上说:引用由于不是一个对象不存在引用的引用的复合类型,但是指针是对象,存在多级指针。同时存在指向指针的引用,不存在指向引用的指针。

 

 

 

 

 


你可能感兴趣的:(引用与指针区别,引用深层次理解)