大家好,小霞來為大家解答以上的問題。c語言取消對null指針的引用,指針的引用這個很多人還不知道,現在讓我們一起來看看吧!

1、引用可以看作一個常量指針,如: int a=10; int &b=a; const int *c=&a 上面兩句的含義差不多。
2、 對于簡單應用,從低層的實現來看是一樣的: int a=10; int *b=&a; 生成這樣的代碼 mov [ebp],10 lea eax,[ebp] mov [ebp-10],eax 引用: int a=10; int &b=a; 生成同樣的代碼 mov [ebp],10 lea eax,[ebp] mov [ebp-10],eax 但是在進行參數傳遞時就出現了不一樣。
3、 下面拷貝了關于函數傳遞指針和引用的討論中一段內容,實在懶得寫了,樓主湊合看吧。
4、 參數傳遞指針時將直接對指針指向的地址進行操作 傳遞指針的引用時,通過間接尋址,來實現對〔指針指向的地址〕進行操作。
5、 看看下面一段程序反匯編后的內容就很清楚了 #include using namespace std; void f1(int *&a) { int *b; b=a; } void f2(int *a) { int *b; b=a; } void main() { int m=10; int *n=&m; f1(n); f2(n); } //--------------------------------------------------------------------------- * Referenced by a CALL at Address: |:00401187 | :00401150 55 push ebp :00401151 8BEC mov ebp, esp :00401153 51 push ecx //[ebp+08]即為壓棧內容:n的有效地址 :00401154 8B4508 mov eax, dword ptr [ebp+08] //取得主函數中m的有效地址--》edx :00401157 8B10 mov edx, dword ptr [eax] //b=a; :00401159 8955FC mov dword ptr [ebp-04], edx :0040115C 59 pop ecx :0040115D 5D pop ebp :0040115E C3 ret * Referenced by a CALL at Address: |:00401190 | :00401160 55 push ebp :00401161 8BEC mov ebp, esp :00401163 51 push ecx //取得壓棧內容:n的有效內容(即m的有效地址) :00401164 8B4508 mov eax, dword ptr [ebp+08] //b=a; :00401167 8945FC mov dword ptr [ebp-04], eax :0040116A 59 pop ecx :0040116B 5D pop ebp :0040116C C3 ret --------------->函數開始<---------------------------- :00401170 55 push ebp :00401171 8BEC mov ebp, esp :00401173 83C4F8 add esp, FFFFFFF8 int m=10; :00401176 C745FC0A000000 mov [ebp-04], 0000000A int *n=&m; :0040117D 8D45FC lea eax, dword ptr [ebp-04] :00401180 8945F8 mov dword ptr [ebp-08], eax f1(n); //由于形參是引用變量,所以將n的有效地址壓棧 :00401183 8D55F8 lea edx, dword ptr [ebp-08] :00401186 52 push edx :00401187 E8C4FFFFFF call 00401150 :0040118C 59 pop ecx f2(n); //由于形參是指針變量,所以將n的有效內容壓棧(即m的有效地址) :0040118D FF75F8 push [ebp-08] :00401190 E8CBFFFFFF call 00401160 :00401195 59 pop ecx :00401196 59 pop ecx :00401197 59 pop ecx :00401198 5D pop ebp :00401199 C3 ret// 函數的返回值類型依據設計者的意圖來確定,我結合調用代碼給你講一下返回指針的引用,和返回指針的不同(見注釋,不明白在hi我) 我相信這個模板類定義中有這樣一段代碼: template class BTreeNode{ //... public: BTreeNode* left; // 指針數據成員,指向左節點 //... } 我們就以此為基礎來講: (1)對于返回指針的引用: BTreeNode *&Left(){return left;} // 調用代碼 BTreeNode Node; // 定義一個節點, 假如此時Node.left指向的地址為0x00000000 BTreeNode *pLeft = Node.left(); // 返回指針引用 pLeft = (BTreeNode*)0x00040000; // 改變指針所指的內存地址, 由于是返回的指針引用,則此時Node.left的值已經被改變為0x00040000了 (1) 對于返回指針類型 BTreeNode *Left(){return left;} // 調用代碼 BTreeNode Node; // 定義一個節點, 假如此時Node.left指向的地址為0x00000000 BTreeNode *pLeft = Node.left(); // 返回指針拷貝,此時pLeft指向的地址為0x00000000 pLeft = (BTreeNode*)0x00040000; // 改變指針所指的內存地址, 由于是返回的只是指針的拷貝,則此時Node.left的值仍然為0x00000000 相信你已經明白兩者之間的區別了!至于為什么要這么設計,依賴于二叉樹數據結構的物理意義和施加于其上的操作需求,這個已經超出了程序語言的本身了。
本文到此分享完畢,希望對大家有所幫助。