C語言位址傳遞和值傳遞簡析

2021-06-22 14:10:26 字數 1399 閱讀 2179

**:

不少同學在學到c語言的指標部分時感到很困惑,對經常提到的「值傳遞」和「位址傳遞」兩個概念弄不明白。實際上,因為位址本身也可以作為乙個特殊的「值」,所以位址傳遞也是一種特殊的值傳遞。只是為了強調其特殊性,故稱之為「位址傳遞」。我們在學習過程中可以視引數的形式而區別對待,比如若引數傳遞的是簡單資料型別的數值,則將其歸類為值傳遞方式;若引數傳遞的是變數的位址,則視其為位址傳遞方式。

值傳遞過程中,

被調函式的形參作為被調函式的區域性變數處理,即在記憶體的堆疊中開闢空間以存放由主調函式放進來的實參的值,從而成為了實參的乙個拷貝。值傳遞的特點是被調函式對形參的任何操作都是作為區域性變數進行,不會影響主調函式的實參變數的值。

而在位址傳遞過程中,被調函式的形參雖然也作為區域性變數在堆疊中開闢了記憶體空間,但是這時存放的是由主調函式放進來的實參變數的位址。被調函式對形參的任何操作都被處理成間接定址,即通過堆疊中存放的位址訪問主調函式中的實參變數。正因為如此,被調函式對形參做的任何操作都影響了主調函式中的實參變數。

下面我們用書上出現頻率最高的乙個程式來分別實現值傳遞過程和位址傳遞過程。

void swap(int x,int y)

void main()

這顯然是乙個值傳遞的過程。假設我們從鍵盤輸入兩個資料:5,9,先來看一下執行結果:

(swap):9,5

(main):5,9

按照值傳遞的特點,我們可以很清楚的看到,雖然在swap函式中暫時使得執行結果顯示了交換後的資料,即達到了交換的目的,但實際情況卻是隨著swap函式的結束,被作為區域性引數的形參x,y以及swap函式本身的區域性引數temp都將結束其生存期,在記憶體中的儲存空間被釋放。因此實參a,b的並未受到影響,依然保持原值。

從這道程式中我們也可以學到乙個方法,比如有時不需要修改實參,但是又需要被調函式所作的工作能夠得以體現,就可以靈活的在被調函式中使用列印語句。因此上面的程式可以改寫為:

void swap(int x,int y)

main()

在輸入5,9兩個數字後,得到的執行結果是:

從大到小排列的順序為:9,5

你看這樣就可以使用相對容易理解的值傳遞方式,巧妙的解決問題了,並得到了想要的答案,雖然我們並未真正的讓主函式中的兩個變數發生改變。

再來看位址傳遞方式:

void swap(int *p,int *q)

void main()

假設我們從鍵盤輸入兩個資料:5,9,先來看一下執行結果:

9,5在這個程式中用指標變數作引數,雖然傳送的是變數的位址,但實參和形參之間的資料傳遞依然是單向的「值傳遞」,即呼叫函式不可能改變實參指標變數的值。但它不同於一般值傳遞的是,它可以通過指標間接訪問的特點來改變指標變數所指變數的值,即最終達到了改變實參的目的。

這一部分內容對初學者來說理解起來有一定的難度,所以在學習過程中一定要多想多練多思考,希望以上的講解能對初學者有所幫助。

C語言位址傳遞和值傳遞簡析

c語言沒用引用傳遞,想用 引用傳遞,把。c改成。cpp,就能編譯通過。若引數傳遞的是簡單資料型別的數值,則將其歸類為值傳遞方式 若引數傳遞的是變數的位址,則視其為位址傳遞方式。值傳遞過程中,被調函式的形參作為被調函式的區域性變數處理,即在記憶體的堆疊中開闢空間以存放由主調函式放進來的實參的值,從而成...

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