5、應用
- 做參數
我們知道實參的改變不影響形參,所以這種寫法并不能改變值,因為此刻是 傳值調用 :
按照之前 c 的寫法,我們使用 傳址調用 ,用指針修改:
但是學習引用之后,完全可以用引用修改:
x 和 y 分別是 a 和 b 的引用,對 x 和 y 進行修改,就是對 a 和 b 進行修改,所以值也被修改成功了。
調試一下:
它們的地址是完全相同的。而這里這里既不是傳值調用,也不是傳址調用,而是傳引用調用。
思考:上面三個函數是否構成函數重載?構成,但無法調用。
根據函數名修飾規則,傳值和傳引用的是不一樣的,比如會加上 R 做區分。
但是不能同時調用傳值和傳引用,因為有歧義,就會導致調用不明確 ,編譯器并不知道調用哪個:
引用解決二級指針生澀難懂的問題 :
講單鏈表時,我們寫的由于是沒有頭結點的鏈表,所以修改時,需要二級指針,對于指針概念不清晰的小伙伴們可能比較難理解。
但是學了引用,就可以解決這個問題:
結構定義:
typedef structSListNode{
int data;
struct SListNode* next;
}SLTNode;
原代碼:
void SListPushFront(SLTNode** pphead, SLTDateType x)
{
SLTNode* newnode = BuyListNode(x);
newnode->next = *pphead;
*pphead = newnode;
}
// 調用
SLTNode* pilst = NULL;
SListPushFront(&plist);
修改后:
void SListPushFront(SLTNode*& pphead, SLTDateType x) // 改
{
SLTNode* newnode = BuyListNode(x);
newnode->next = *pphead;
*pphead = newnode;
}
// 調用
SLTNode* pilst = NULL;
SListPushFront(plist); // 改
修改之后的代碼里的二級指針被替換成了引用。
而這里的意思就是給一級指針取了一個別名,傳過來的是plist,而plist 是一個一級指針,所以會出現 * ,而這里就相當于 pphead 是 plist 的別名。而這里修改 pphead ,也就可以對 plist 完成修改。
但是有時候也會這么寫 :
結構改造:
typedef structSListNode
{
int data;
struct SListNode* next;
}SLTNode, *PSLTNode;
這里的意思就是將 struct SListNode*
類型重命名為 PSLTNode
。
代碼:
void SListPushFront(PSLTNode& pphead, SLTDateType x) // 改
{
PSLTNode newnode = BuyListNode(x);
newnode->next = pphead;
pphead = newnode;
}
// 調用
PSLTNode plist = NULL;
SListPushFront(plist);
在 typedef
之后,PSLTNode
就是結構體指針,所以傳參過去,只需要在形參那邊用引用接收,隨后進行操作,就可以達成目的。
而形參的改變影響實參的參數叫做輸出型參數,對于輸出型參數,使用引用就十分舒適。
如果了解引用,那么這一部分是相當好理解的,一些數據結構教科書上也是這么寫的,但是如果不懂引用,甚至會覺得比二級指針還難以理解。
在我們學習了引用之后,之后也可以這么寫代碼,更加方便。
- 做返回值
要搞清楚這一塊,我們先進行些許鋪墊。
int add(int a, int b)
{
int c = a + b;
return c;
}
int main()
{
int ret = add(1, 2);
cout << ret << endl;
return 0;
}
這里看似很簡單,就是把add函數計算結束的結果返回,但是這里包含了 傳值返回 。
若從棧幀角度看,會先創建 main 函數的棧幀,里面就會有 call 指令,開始調用 add 函數。而 add 函數也會形成棧幀,而棧幀中也有兩塊小空間,用來接受參數,分別為 a 和 b,而里面的 c 則用來計算結果并返回。
而對于傳值返回,返回的并不是 c ,而是返回的是 c 的拷貝。而這其中會有一個臨時變量,返回的是臨時變量(見函數棧幀)
如果返回的是 c 的話,由于 add 的函數棧幀已經銷毀了,就會產生很多奇怪的問題。c 能不能取到都是未知,而這時都是非法訪問,因為空間已經被歸還給系統了,所以必定是c拷貝后的數據被返回。
-
C語言
+關注
關注
180文章
7614瀏覽量
137745 -
C++
+關注
關注
22文章
2114瀏覽量
73861 -
面向對象
+關注
關注
0文章
64瀏覽量
10004
發布評論請先 登錄
相關推薦
Visual C++教程之C++的基礎知識介紹
![Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的基礎知識介紹](https://file.elecfans.com/web1/M00/84/E7/o4YBAFxmeHWAZNqUAADfu76tYr0942.png)
Visual C++教程之C++的語言資料概述免費下載
![Visual <b class='flag-5'>C++</b>教程之<b class='flag-5'>C++</b>的語言資料概述免費下載](https://file.elecfans.com/web1/M00/84/E7/o4YBAFxmeeGAatfKAAVmMkzMxqg765.png)
C++程序設計教程之數據類型的詳細資料說明
![<b class='flag-5'>C++</b>程序設計教程之數據類型的<b class='flag-5'>詳細</b>資料說明](https://file.elecfans.com/web1/M00/85/49/o4YBAFxubvqAXFGNAAGlyV-6NvE460.png)
C++程序設計教程之數組的詳細資料說明
![<b class='flag-5'>C++</b>程序設計教程之數組的<b class='flag-5'>詳細</b>資料說明](https://file.elecfans.com/web1/M00/89/9A/pIYBAFyJ_9CAGhxEAADEsyOnfP0280.png)
C++程序設計教程之指針的詳細資料說明
![<b class='flag-5'>C++</b>程序設計教程之指針的<b class='flag-5'>詳細</b>資料說明](https://file.elecfans.com/web1/M00/89/31/o4YBAFyKC8OATT1oAABigeAsLNQ316.png)
C++程序設計教程之C++工具的詳細資料說明
![<b class='flag-5'>C++</b>程序設計教程之<b class='flag-5'>C++</b>工具的<b class='flag-5'>詳細</b>資料說明](https://file.elecfans.com/web1/M00/89/3A/o4YBAFyKGU2ARmALAAKVagtx2S8669.png)
C++程序設計的基礎知識初步了解C++的資料免費下載
![<b class='flag-5'>C++</b>程序設計的基礎知識初步了解<b class='flag-5'>C++</b>的資料免費下載](https://file.elecfans.com/web1/M00/95/47/o4YBAFz-DYOAIEloAACt1tceweA466.png)
評論