C語言函式指標引數也是傳值呼叫

2021-06-05 14:24:12 字數 772 閱讀 6163

先看看下面一段**:

#include

#include

void f(int *pi)

main()

如果你指望函式f能幫你改變pi的值,那你就錯了,執行上面這段**,你會發現輸出是1。剛開始我也很詫異,我不是傳了指標進去嗎,為什麼沒能保留改變的結果呢?

別著急,再看看下面一段**:

#include

#include

void f(int *pi)

main()

這次執行**,i的值被函式f改變了。對比一下兩段**,你會發現:第二段**中傳給函式f的實參是乙個整型變數位址的拷貝,函式f拿到了這個位址,改變的是這個位址指向的變數。這樣當然可以成功,位址和其拷貝的值是一樣的,所以按照這兩個位址找到的變數自然也是一樣的。第一段**則完全不同,雖然傳給函式f的實參也是乙個整型變數位址的拷貝,但函式f試圖通過改變這個拷貝來改變原來的位址值,這當然行不通,因為指標和它的拷貝是兩個變數。指標也是變數,它在函式呼叫過程中也是傳值呼叫的。其實第一段**和下面這段**效果是類似的:

#include

#include

void f(int i)

main()

這段**大家一看就知道函式f不會改變i的值,因為主函式傳給f的只是變數i的乙份拷貝,改變拷貝的值並不會影響原變數的值。其實這段**和第一段有什麼區別呢,不過乙個是整型變數,乙個是指標變數,它們都是傳值呼叫的。

#include

#include

int *f()

main()

指標變數也是傳值呼叫的(C語言)!

先看看下面一段 include include void f int pi main 如果你指望函式f能幫你改變pi的值,那你就錯了,執行上面這段 你會發現輸出是1。剛開始我也很詫異,我不是傳了指標進去嗎,為什麼沒能保留改變的結果呢?別著急,再看看下面一段 include include void ...

C語言函式引數的傳值和傳址呼叫

大家都知道,c語言一般的引數都是傳值呼叫的,但有時候也有例外,下面就分析一下什麼時候傳值呼叫,什麼時候傳址呼叫。標量引數都是傳值呼叫,不會對標量產生任何影響 include void add one int value int main int argc,char const argv 執行結果 傳...

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

本文參考這兩篇文章 文章 一 文章二。在學習資料結構中建立單鏈表的時候,疑惑 已經定義了node,用到結構體指標的時候直接用 node就好了,為什麼還要再定義乙個 linklist呢,為什麼傳參的時候又要用linklist l呢?下面我們就來循序漸進,由淺入深來解決問題,這裡舉兩個例子作為比較。首先...