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

C語言函式引數傳遞問題

C語言 閱讀(2.95W)

導語:在一些C語言教材和參考資料中,常常把函式引數傳遞分為“數值傳遞”和“地址傳遞”兩種方式,這種概念模糊的分類方法給初學者的理解造成一定程度的困難。下面就由小編為大家介紹一下C語言函式引數傳遞問題,歡迎大家閱讀!

C語言函式引數傳遞問題

  1概述

函式是C語言程式的基本構成模組,通過使用函式,不僅可以省去重複程式碼的編寫,還可以使程式更加模組化,從而有利於程式的閱讀、修改和完善。對於C語言的初學者來說,準確理解函式引數的傳遞方式是難點之一。一些C語言程式設計教材[1][2]中把函式間的引數傳遞分為“數值傳遞”和“地址傳遞”兩種方式,這種分類很容易使初學者混淆概念,更不能抓住引數傳遞的本質。

  2傳遞方式和資料型別

“值傳遞”是函式引數的唯一傳遞方式。函式的引數分為實際引數(簡稱實參)和形式引數(簡稱形參),在定義函式時使用的引數叫形參,在呼叫函式時使用的引數叫實參。實參可以是常量、變數或表示式,但要求它們有確定的值。實參與形參的結合只有一種方式,即“值傳遞”,把實參的值賦給形參變數。“值傳遞”具有單向性,只能把實參傳給形參,而不能由形參回傳給實參。

不同資料型別的函式引數對主調函式中變數的作用有所不同。函式引數可取的資料型別為基本型別、構造型別、指標型別或空型別,如圖所示。空型別表示該函式為無參函式,在此不作介紹。其餘資料型別又可分為三類:普通型別,包括基本型別、結構體型別和共用體型別;指標型別;陣列型別。函式引數為普通型別時,對函式的呼叫不用影響到主調函式中變數的值;函式引數為指標型別或陣列型別時,對函式的呼叫可以修改主調函式中有關變數的值。

  3普通型別變數作為函式引數

普通變數作為函式引數時,對形參的修改不會影響到實參。如下例所示,通過“值傳遞”,形參x儲存了實參a的值,形參y儲存了實參b的值,因為形參和實參是相互獨立的不同變數,所以在swap函式中對形參x和y進行的交換不會反映到實參a和b中。

#include

void swap(int x, int y)

{

int temp;

temp=x; x=y; y=temp;

}

void main()

{

int a, b;

scanf("%d%d", &a, &b);

swap(a, b);

printf("%d %d", a, b);

}

輸入:1 2

輸出:1 2

  4指標作為函式引數

變數的指標就是變數的地址,存放變數地址的變數叫指標變數,定義指標變數的一般形式為:

基型別*指標變數名;

通過指標變數訪問其所指向的變數的方式稱為間接訪問方式。如下例所示。

int age;

a=10; //直接訪問方式

int* p=&a;

*p=11; //間接訪問方式

指標型別作為函式引數時,引數傳遞方式仍然是“值傳遞”,即把實參的值傳遞給形參。不同的是引數為指標變數,可以通過形參的間接訪問方式來讀取或修改主調函式中有關變數的值。

如下例所示,通過“值傳遞”,形參x儲存了變數a的.地址,形參y儲存了變數b的地址,即x指向變數a,y指向變數b,在swap函式中通過間接訪問方式交換了變數a和b的值。

#include

void swap(int* x, int* y)

{

int temp;

temp=*x; *x=*y; *y=temp;

}

void main()

{

int a, b;

scanf("%d%d", &a, &b);

swap(&a, &b);

printf("%d %d", a, b);

}

輸入:1 2

輸出:2 1

  5陣列名作為函式引數

陣列元素和陣列名也可以作為函式引數,陣列元素作為函式引數與普通變數用法相同,陣列名作為函式引數與指標變數相同。

用陣列名作函式形參時,指定陣列大小是不起任何作用的。因為C語言編譯對形引數組大小不做檢查,只是將實引數組的首地址傳遞給形引數組。實引數組名即是實引數組的首地址,相當於指標常量;形引數組名相當於指標變數。實際上,C編譯都是將形引數組名作為指標變數來處理的[3]。所以,陣列名作為函式引數可以按指標作為函式引數來理解。

如下例所示,陣列名array代表陣列array的首地址,通過“值傳遞”,形引數組名a,也可以理解為形參指標變數a,儲存了陣列array的首地址,因此,在swap函式中對形引數組a的操作即是對實引數組array的操作。

#include

void swap(int a[])

{

int temp;

temp=a[0]; a[0]=a[1]; a[1]=temp;

}

void main()

{

int array[2];

scanf("%d%d", &array[0], &array[1]);

swap(array);

printf("%d %d", array[0], array[1]);

}

輸入:1 2

輸出:2 1

  6結論

綜上所述,C語言函式引數問題主要涉及兩個概念:傳遞方式和資料型別。實參與形參的傳遞方式只有一種,即“值傳遞”。引數的資料型別可以為普通型別、指標型別和陣列型別,陣列型別實際上是按指標型別來處理的,所以,主要是指標型別與非指標型別的區別。對初學者來說,問題的難點在於資料型別的不同而非傳遞方式,即指標型別變數與非指標型別變數的區別。