當前位置:才華齋>計算機>C語言>

C語言函式引數傳遞規律

C語言 閱讀(1.12W)

導語:C語言的模組設計主要是通過函式實現的,函式間資訊的傳遞主要是通過引數實現的。函式的引數傳遞包括傳值和傳址。下面就由小編為大家介紹一下C語言函式引數傳遞規律,歡迎大家閱讀!

C語言函式引數傳遞規律

  1、引數的傳遞方式

C語言函式的引數傳遞可以歸納為兩種方式:傳值和傳址。下面用例項和圖示兩種方式進行描述。

1.1傳值

傳值傳遞方式主要出現在實參和形參都是變數的時候,如基型別變數、陣列元素、結構體變數作引數時,進行的就是值傳遞,程式如下:

在上述的例子中,函式呼叫時如圖1(a)所示。實參將值傳給形參,形參在子函式裡發生互換,但不能將互換的值傳回給實參,結果如圖1(b)所示。因此實參在整個過程中沒有發生變化,由此可以總結當用普通變數作引數時,進行的是單向的值傳遞,只能實參傳形參,形參無法傳實參。

圖1變數作引數的呼叫過程1.2傳址

該方法中函式呼叫時引數間傳遞的地址有以下3種情況:變數的`地址作引數、陣列名作引數以及指標作引數。由於變數的地址作引數與指標作引數類似,這裡就不再舉例,主要針對陣列名作引數和指標作引數進行探討。

1.2.1陣列名作引數

陣列名作引數的程式如下:

void f(int t[],int n)

{int i; for(i=0;i  void main()

{ int a[4]={1,2,3,4},i; f(a,4); for(i=0;i<4;i++) printf(“%d ”,a[i]);}

陣列名作引數時,傳遞的是陣列的首地址,即實引數組和形引數組共用一段記憶體空間,如圖2(a)所示。在子函式中對陣列t的所有元素進行賦值,其實也就是對陣列a的所有元素進行賦值,如圖2(b)所示。所以當用陣列名作引數時,實參和形參共享一個數組,形引數組的改變也就是實引數組的改變,其程式如下:

void swap(int *a, int *b)

{int temp; temp=*a;*a=*b;*b=temp;}

main()

{int x=3, y=5, *p=&x, *q=&y;

swap(p,q); printf("%d,%d",*p,*q);}

圖2陣列名作引數的呼叫過程1.2.2指標作引數

指標作引數與陣列名作引數類似,傳遞的也是地址,但此時不是共享一個數組,而是共享一個變數的地址,即實參指標和形參指標共同指向同一個變數,共享同一個變數地址如圖3所示。這時有2種情況:改變形參的指向;改變形參所指向的變數。上面的例子屬於第二種情況,形參指向的變數值發生變化,也就是實參指向的變數值發生變化。把此例稍做修改得如下程式:

void swap(int *a,int *b)

{int *temp; temp=a; a=b; b=temp;}

將函式稍做改動後,子函式的功能只是改變了形參指標的指向,如圖4(c)所示。對實參並無影響,從而也不會影響實參所指向的變數值。

  2、結語

呼叫函式時,從引數的傳遞情況來看,其實質就是傳值和傳址,傳值是變數作引數,實參只負責給形參賦初值,形參在整個過程中的改變都不影響實參,所以是單向的值傳遞。傳址是陣列名和指標作引數,此時體現的就是共享,陣列名作引數,實參和形參共享一個數組,形引數組的改變就是實引數組的改變;指標作引數共享的是同一個變數的地址,即實參和形參共同指向同一個變數,當改變形參所指向的變數值時,實參所指向的變數值也一同改變,因為它們指向的是同一個變數。如果改變的是形參的指向,則不影響實參指標的改變。