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

2021-06-15 18:55:11 字數 851 閱讀 6840

先看看下面一段**:

#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語言 函式傳參 傳值 傳指標 傳指標的指標

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

C 函式的傳值呼叫 指標呼叫 引用呼叫

該方法把引數的實際值複製給函式的形式引數。在這種情況下,修改函式內的形式引數對實際引數沒有影響。include using namespace std 函式宣告 void swap int x,int y int main 函式定義 void swap int x,int y 呼叫函式的時候,在函式...