c語言關於函式傳參之傳位址和傳資料問題

2021-10-23 16:38:40 字數 2584 閱讀 9945

下面從傳資料和傳位址的區別分開講述;我們先了解一下乙個函式中的什麼資料都存放在什麼地方的,什麼時候它需要傳位址,什麼時候只需要傳遞資料,並且什麼三時候會被釋放掉:
如圖是c語言的記憶體分布圖

(1)當我們在乙個函式內申請乙個變數時(calloc,malloc等函式申請的記憶體空間和static修飾的變數除外),它是存放在棧空間的資料,在當前函式退出時,該資料所擁有的記憶體空間也會被釋放掉,因此我們在定義變數時要考慮該變數是否要被其他函式頻繁呼叫等問題

(2) 在linux下我們可以使用readelf -s 檔名進行檢視某個檔案它的資料都有存放什麼地方,圖中框起來的是儲存在段中的三種資料

一、我們不需要改變本身函式中該變數的值,當這種情況下,我們傳參的時候只需要把這個資料傳遞過去,

測試**:

/*

測試:函式傳參傳遞資料的情況

*/#include

void

func

(int a,

int b)

intmain()

執行結果:

(注:位址不同,代表變數不同)

(1)void func(int a,int b)裡的int a和int b只是用於定義然後接收傳進來的引數(形參),因此main函式中的a和b的位址與func函式中a和b的位址不一致

(2) 當**執行到main函式裡面的func(a,b);時其實只是相當於main函式的a和b賦值給func函式的a和b中

(3)main函式與func函式中定義的a和b其實是沒有關係的,只是變數名相同,只是為了傳參時方便易辨別

(4)因為main函式的a和b沒有改變,改變的只是func裡面的a和b,因此mian函式裡面的執行a依舊是10,b依舊是20;並沒有任何變化

(5)func中的a和b因為是只是乙個函式內的普通變數,並非static修飾的變數也不是全域性變數,因此是存放在棧裡面的資料,存放在棧的資料的特點是:在函式執行結束後會被釋放

如圖是**的**:

二、函式傳遞位址的問題;當把變數的位址傳遞過去後,如果在其他函式修改了這個位址裡面的值的時候,那麼它原來的值就已經改變了的(除了const修飾的變數不可修改裡面的值)

測試**:

/*

*/#include

//如果形參變數加了const修飾後只可讀,不可修改它位址所在的資料,編譯時會報錯

//void func(const int *a,const int *b)

void

func

(int

*a,int

*b)int

main()

執行結果:

(注:兩個函式中的a和b的位址其實是一樣的)

(1)當這個函式把資料的位址傳遞過去的時候函式的變數需要使用指標接收,因為接收的是乙個位址,mian』與func之間的引數傳遞可看作:int *a = &a; int *b = &b;

(2)func接收的a和b變數的位址,因此當在func函式中修改了a和b變數位址所在的資料時,其實是修改mian函式中a和b的值;

(3)例如我們可以假設main函式中a和b的位址分別為0x1000和0x1004(乙個int型別資料佔4個位元組),當我們func(&a,&b);其實只是傳遞這兩個位址過去而已,然後func函式中只是把0x1000和0x1004這兩個記憶體位址中的資料修改為20和30

(4)因為main函式傳遞給func函式的是位址,因此func函式在列印時需要解引用取它位址裡面的資料

下面是關於這個**的**:

總結:

(1)函式傳參時傳遞的是資料的話,其實只是相當於這個函式的值賦值到另乙個函式

(2)函式傳參時傳遞的是位址的話,這個時候是把變數的位址傳遞過去,並不是資料的位址傳遞過去,然後接收的函式需要對變數所在的位址修改裡面值的話是需要解引用該位址後才能修改和讀取裡面的資料

(3)函式傳參傳位址時,在其他函式通過修改該位址的資料後,它這個位址的值就已經改變了,並不會因為函式執行完銷毀,因為是對位址操作,銷毀的只是乙個存放有變數位址的指標

這些都是關於我個人對函式傳參的一些理解,包括圖也都是自己畫的;如果有什麼地方寫錯或者畫錯了麻煩告知一下,真的非常感謝

函式位址傳參

include stdio.h intmain for i 0 iprintf d a i printf n排序之後 n sort a,n 相當於是sort a,n 這裡是將陣列a的位址傳遞下去,接下來承接這個位址的函式 就是對這個位址中的值進行操作,所以一般使用這個位址傳參 1.是想通過另乙個 函...

python 函式傳參 傳參和傳引用

首先還是應該科普下函式引數傳遞機制,傳值和傳引用是什麼意思?函式引數傳遞機制問題在本質上是呼叫函式 過程 和被呼叫函式 過程 在呼叫發生時進行通訊的方法問題。基本的引數傳遞機制有兩種 值傳遞和引用傳遞。值傳遞 passl by value 過程中,被調函式的形式引數作為被調函式的區域性變數處理,即在...

c語言函式傳參

引入 不過對於函式的引數呼叫時常會出現問題。include int p int a int main void 這裡的自定義函式p,接收乙個int型別的引數,並定義為a。雖然自定義函式和主函式的變數名,都為a,但是這裡的a是兩個變數。雖然函式也將a返回了,但是主函式並沒有接收,忽略了p的返回值。所以...