1. 程式人生 > >結構體的指標和C語言函式傳參

結構體的指標和C語言函式傳參

資料結構的基礎,是函式的傳遞和結構體的應用。

首先從函式傳參做起筆記,c語言函式傳參的本質都是傳值。我的大學教材上舉例為傳值和傳地址;

我借用百度上的一些回答作為引用:

(1)傳值,就是把你的變數的值傳遞給函式的形式引數,實際就是用變數的值來新生成一個形式引數,因而在函式裡對形參的改變不會影響到函式外的變數的值。 (2)傳址,就是傳變數的地址賦給函式裡形式引數的指標,使指標指向真實的變數的地址,因為對指標所指地址的內容的改變能反映到函式外,也就是能改變函式外的變數的值。

在C++11中,推薦對引數的使用上使用傳引用更加安全;寫c with class那種c語言,也可以使用傳引用,hhh;

傳值和傳地址的本質都是傳入函式(建立函式棧幀)而不論是單純的傳入int a引數,還是int* pa,都是傳入值的一個複製。

這裡的重點就是傳入函式的 ,是引數的複製

所以我們在c++和c語言程式編寫的時候,要注意函式傳參的實際問題。

最經典的一個例子就是網上很多的swap函式,我在看書學習時,舉例也是這個(程式碼參考《c和指標》)。

void swap(int* first, int *second)
{
	*first = *first^*second;
	*second = *first^*second;
	*first = *first^*second;
}

在連結串列操作,二叉樹操作時,如果要改變next指標(或者子孩子指標)指向,這個時候傳入的引數應該是二級指標,這樣在函式體內部獲得的就是next指標的地址的拷貝,通過對這個拷貝解引用,才能獲得真正的next的指標。 

結構體指標問題類似傳參問題,我繪製導圖作為筆記。

(*pp)這個結構體的地址(即&(*pp)或者說&(pp->next))是結構體首元素的地址。

pp的地址在棧上,其內容是堆上某一地址(堆空間程式設計師控制,棧空間OS分配)。

pp所儲存的地址就是結構體的地址,即第一條提到的地址。

pp指向這個結構體(或者說結構體型別指標pp)。

順便說下,這個結構體大小為24詳情看我的另一篇部落格。