寫這一篇部落格的主要目的,在於整理回顧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...