C語言 函式傳參 傳值 傳指標 傳指標的指標

2021-10-17 07:45:14 字數 1786 閱讀 3600

本文參考這兩篇文章:文章

一、文章二。

在學習資料結構中建立單鏈表的時候,疑惑:已經定義了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 三種傳遞引數方式 傳引數的值 稱值傳遞,簡稱傳值 傳引數的位址 稱位址傳遞,簡稱為傳址 和引用傳遞 稱為傳引用 相應的函式傳值呼叫,傳址呼叫和傳引用呼叫 形參 實參 函式定義時參數列中的引數稱為形式引數,簡稱形參 函式呼叫時參數列中的引數稱為實際引數,簡稱實參。實參和形參之間的資料傳遞...