C語言值傳遞和位址傳遞詳解

2022-10-08 05:06:05 字數 1447 閱讀 5502

目錄

我們舉乙個例子:

寫乙個函式找出兩個整數中的最大值。

#include

//get_max函式

int get_max(int x,int y)

int main()

執行結果是:

max = 20

我們來分析一下這個函式呼叫過程:

num1,num2作為實參傳入get_max()函式,形參x,y被例項化(分配記憶體單元),num1和num2的值按照函式形參表順序對應地傳給了x和y,也就是x=www.cppcns.com10,y=20,然後函式將x和y中較大的乙個的值返回。函式呼叫完畢和y被自動銷毀。

我們看一下函式的特徵,如果函式的形參和實參一致,這就是值傳遞。

再舉乙個例子:

寫乙個函式交換兩個整形變數的內容。

很多初學者一看覺得太簡單了,按照值傳遞我們來寫一遍。

#include

/程式設計客棧/值傳遞

void sjfkdzzwap1(int x, int y)

int main()

但此時的結果是什麼呢?

num1,num2值並沒有變啊,並沒有交換啊,為什麼呢?

因為當實參傳給形參的時候,形參是實參的乙份臨時拷貝,對形參的修改不會影響實參

我們來列印一下各變數的位址

可以看到,實參有自己的位址,形參也有自己的位址,實參只把自己的值傳給了形參,位址各有各的,實參的位址上放的值並沒有變啊,並且形參在函式呼叫完後就自動銷毀了,也就是說函式內與函式外的變數並沒有建立真正的實質的聯絡。就想象你copy了乙個自己的仿生人,他吃了東西,進你的胃了嗎?肯定他吃他飽,跟你毫無相關是吧(狗頭

那麼這個問題怎麼解決呢?位址傳遞

#include

//值傳遞

void swap1(int x, int y)

int main()

我們來看一下結果

位址傳遞做了什麼?

做位址傳遞時 函式引數是指標變數,指標變數裡面裝著的就是位址嘛,所以實參直接就把自己的位址傳過去了,px裡放的num1位址,py裡放的num2位址, *px就是num1本身, *py就是num2本身,實參本身進行了賦值交換,這次不是你的仿生人了,就是你自己體驗人生。

我們看一下函式特徵:如果傳入的實參是形參的指標,那就是位址傳遞。

其實有乙個問題我好久才想明白:

為什麼上乙個例子(返回兩數中較大的乙個)沒有用位址傳遞也成功了呢?這兩種方式使用的界限是什麼呢?

後來這個疑問終於被解答了:

因為第乙個例子裡num1,num2的值並不需要改變,函式中x,y比較後如果返回x,x的值和a的值是一樣的,這個對結果是不影響的,也就是說,這種問題不需要改變實參的值,形參和實參不需要建立那麼實質的聯絡

但要搞清楚的是,函式返回的是num1本身嗎?是njfkdzzum1位址上的值嗎?不,只是num1的拷貝x位址上的值。

綜上,在需要改變實參的值時一定要使用位址傳遞才行。

C語言 值傳遞 位址傳遞

1.值傳遞 void exchg1 int x,int y main 呼叫exchg1 a,b 有乙個隱含的操作就是int x a int y b 然後函式內部把形參x和y的值對換。所以a和b的值各自不變。2.位址傳遞 void exchg2 int px,int py main 同樣的,呼叫exc...

C語言 關於值傳遞和位址傳遞

初學者在學習c語言時候乙個極容易迷惑的地方就在函式的 值傳遞 和 位址傳遞 了,出現這個迷惑的原因有些教材沒有把記憶體圖畫出來,只是簡單的舉了幾個例子,結果初學者按照例子寫寫 倒是能執行出來,但始終沒明白到底是怎麼回事,下面我通過例子和畫圖來相信說明裡面的細節問題。在開始之前有乙個前提,你一定要粗略...

C 值傳遞和位址傳遞

在c 呼叫函式時,會存在值傳遞和位址傳遞,也叫 傳引用和傳值 正好用到這方面內容,因此做個總結,加深一下理解,如果有不到位或者不準確的地方,請小夥伴們多指教。1 位址傳遞時,形參和實參是同乙個變數,即使用相同的記憶體空間,二者有相同的位址。而傳值時二者位址不同 2 位址傳遞時,由於沒有新建變數,所以...