關於C語言中的引數傳遞的個人理解

2021-08-17 10:15:40 字數 1973 閱讀 7939

寫這一篇部落格的主要目的,在於整理回顧c語言中關於引數傳遞的內容。大家最早接觸引數傳遞,肯定都是在學習子函式的時候,比如 下面這一段很簡單的**:

#includevoid main()

int max(int i, int j)

在main函式中呼叫max子函式,同時傳遞進去兩個值(1,5),最後輸出結果 a=5。這種方式就是最簡單的傳遞值。

一、傳遞值

後來,我們發現有的時候使用這種方法不能達到我們想要的結果。比如下面這段**:

#includevoid main()

void swap_1(int a, int b)

同樣,我們在main函式中傳入了a和b的值,本來以為能利用swap_1函式,將a和b中的值互換,但是最後發現輸出結果依舊是a=1 b = 3。這裡就需要把實參和形參區別開來,並且知道引數傳遞中,傳值是單向傳遞的。

一方面,雖然我們把swap函式的形參取名a和b,但是這兩個和main函式裡定義的a和b完全是不相干的兩碼事。實參a和b在將自己的數值交給子函式後,就不會管子函式中的發生的事了。而swap_1函式中,a和b的值不管怎麼變換,都不會影響實參。

另一方面,在我們平時寫**的時候,應該盡量避免形參命名與實參相同,避免不必要的誤會。

二、傳遞位址值

接著,我們學習了指標,知道第二種傳遞方式叫做傳遞位址值。並且可以很好的解決上述我們想實現的swap效果:

#includevoid main()

void swap_2(int *p1, int *p2)

這裡我們傳遞的是int型實參變數a和b所在記憶體單元的位址值,就是說告訴了子函式swap_2:把這兩個記憶體單元裡的內容進行乙個交換。這樣的話,子函式根據位址值找到對應的記憶體單元,並將兩個記憶體單元中的資料內容進行互換。從而達到了預期效果。

三、傳遞位址

#includevoid main()

; print(a);

printf("a[0] = %d\n",a[0]); //檢驗print函式是否能夠修改原陣列中的內容

system("pause");

}void print(int array[5])

}

這裡面傳遞了位址a,也就是陣列a的在記憶體中的開始位址。這樣形參同樣就直接可以操縱陣列所在的那一片記憶體區域了。並且,我們通過檢驗,發現最後一行輸出:a[0] = 2 ,證明在傳遞位址時,子函式確實能夠操作甚至修改原陣列內容。

四、總結

以上的三個說法其實只是便於理解,正式的問法及答案應該如下:

question: 陣列可以作為函式的引數使用,那麼陣列作函式引數有哪三種形式?

answer:1.陣列元素作為實參使用(傳遞值);

2.形參是指標,實參是陣列(傳遞位址值);

3.形參和實參都是陣列(傳遞位址)。 

如果理解了我舉的三個例子,再來模擬它們分別對應於陣列中的用法,其實也能很快理解並加以記憶。下面還是給出三種方式在陣列中的具體應用的**:

#includevoid main()

; print_1(a[0]);

print_2(a);

print_3(a);

system("pause");

}void print_1(int value) //transmit the value

void print_2(int *p) //transmit the value of address

void print_3(int array[5])      //transmit the address

就是這個樣子,希望能給大家幫助,謝謝。

C語言中的引數傳遞

問 你認為這個函式是在做什麼呀?答 好像是對引數 x,y的值對調吧?請往下看,我想利用這個函式來完成對a,b兩個變數值的對調,程式如下 void main 我問 exchg1 裡頭的 printf x d,y d n x,y 語句會輸出什麼啊?我再問 exchg1 後的 printf a d,b d...

C語言中引數的傳遞方式

c語言中引數的傳遞方式一般存在兩種方式 一種是通過棧的形式傳遞,另一種是通過暫存器的方式傳遞的。這次,我們只是詳細描述一下第一種引數傳遞方式,另外一種方式在這裡不做詳細介紹。首先,我們看一下,下面乙個簡單的呼叫例程 int add int a,int b,int c void main 借助以上例程...

C語言中引數傳遞優化

我以前看了某位大大的分析,多引數函式呼叫會比單一引數更加花費cpu時間,因此使用結構體封裝引數。但是通過分析得到了自己的見解,關於這點是不能一概而論的。仔細檢視win32 api你就會發現,只是擁有眾多引數的時候才會使用結構體封裝,引數少的時候,不進行封裝的,因為你給結構體中的元素賦值也需要花費cp...