本文參考這兩篇文章:文章
一、文章二。
在學習資料結構中建立單鏈表的時候,疑惑:已經定義了node
,用到結構體指標的時候直接用*node
就好了,為什麼還要再定義乙個*linklist
呢,為什麼傳參的時候又要用linklist *l
呢?
下面我們就來循序漸進,由淺入深來解決問題,這裡舉兩個例子作為比較。
首先來看這個例子:
int arr=
;
對於指標不熟悉的同學來說,一開始最容易想到這種方法(傳個指標去接收)
從列印結果可以看出,此法不通,最終的最大值和最小值任是我們給的初始值,這就類似於想通過swap(int a, int b)
來交換a和b的值,我們知道這種方法只能交換傳過去的副本,但原始資料的a,b並沒有交換,所以我們使用指標來解決swap(int *a, int *b)
,這裡和之前的swap(int a, int b)
有「異曲同工」之處,大家細細品味一下。
那該如何解決呢,參照交換a,b的方法,我們也傳指標就是了,所以這裡就變成了傳指標的指標。
我們發現,拿到了我們想要的最大值和最小值。
好了,現在我們再來看一下我們一開始提的問題。
首先我們先來看一下這個問題:
如果想為指標p申請一段記憶體,下面**能實現嗎?
#include
#include
void
getmemery
(int
*p)int
main()
執行結果:
未被分配到記憶體
這是為什麼呢?我們還是利用前面所知來分析,由於傳遞給getmemory函式的引數都是乙個副本,因此函式內的p也是外部p的乙個副本,因此即便在函式內部,將p指向了一塊新申請的記憶體,仍然不會改變外面p的值,即p還是指向null。
如何修改呢?我們需要傳入p的位址,即指向int型別指標的指標。
#include
#include
void
getmemery
(int
**p)
intmain
(void
)
執行結果:
address of p is 0000000000b65a20
從執行結果可以看到,p的值被改變了,而不再是初始的null。
createlisthead方法中傳的就是指向指標的指標,即node **l
。
C 傳值 傳址 傳指標 傳引用
相關概念 c 三種傳遞引數方式 傳引數的值 稱值傳遞,簡稱傳值 傳引數的位址 稱位址傳遞,簡稱為傳址 和引用傳遞 稱為傳引用 相應的函式傳值呼叫,傳址呼叫和傳引用呼叫 形參 實參 函式定義時參數列中的引數稱為形式引數,簡稱形參 函式呼叫時參數列中的引數稱為實際引數,簡稱實參。實參和形參之間的資料傳遞...
傳值 傳引用 傳指標
收藏 相關概念 c 三種傳遞引數方式 傳引數的值 稱值傳遞,簡稱傳值 傳引數的位址 稱位址傳遞,簡稱為傳址 和引用傳遞 稱為傳引用 相應的函式傳值呼叫,傳址呼叫和傳引用呼叫 形參 實參 函式定義時參數列中的引數稱為形式引數,簡稱形參 函式呼叫時參數列中的引數稱為實際引數,簡稱實參。實參和形參之間的資...
傳值 傳引用 傳指標
相關概念 c 三種傳遞引數方式 傳引數的值 稱值傳遞,簡稱傳值 傳引數的位址 稱位址傳遞,簡稱為傳址 和引用傳遞 稱為傳引用 相應的函式傳值呼叫,傳址呼叫和傳引用呼叫 形參 實參 函式定義時參數列中的引數稱為形式引數,簡稱形參 函式呼叫時參數列中的引數稱為實際引數,簡稱實參。實參和形參之間的資料傳遞...