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語言函數參數問題主要涉及兩個概念:傳遞方式和數據類型。實參與形參的傳遞方式只有一種,即“值傳遞”。參數的數據類型可以為普通類型、指針類型和數組類型,數組類型實際上是按指針類型來處理的,所以,主要是指針類型與非指針類型的區別。對初學者來説,問題的難點在於數據類型的不同而非傳遞方式,即指針類型變量與非指針類型變量的區別。
-
C語言插入排序算法及實例代碼
插入排序是排序算法的一種,下面小編為大家整理了C語言插入排序算法及實例代碼,希望能幫到大家!這裏以從小到大排序為例進行講解。基本思想及舉例説明插入排序的基本思想是,將元素逐個添加到已經排序好的數組中去,同時要求,插入的元素必須在正確的位置,這樣原來排序好...
-
C語言學習攻略
導語:C語言作為最流行的程序設計語言,是任何一個計算機專業及其愛好者們都必須掌握的一門編程語言。下面就由小編為大家介紹一下C語言學習攻略,歡迎大家閲讀!一、C語言學習中存在的問題(一)基礎薄弱,無法適應C語言學習的課程通常安排在大一,這個時候,學生們剛剛進入...
-
計算機等級考試二級C語言筆試精選習題
應屆畢業生考試網提供了計算機等級考試二級C語言筆試精選習題,幫助考生鍛鍊解題思路,加深理解知識點。更多資料訪問yjbys計算機等級考試網。1、C語言程序的基本單位是____A)程序行B)語句C)函數D)字符、C、12、C語言程序的三種基本結構是____A、順序結構,選擇結構,...
-
C語言新人常見問題與錯誤
不知不覺,學習C語言也快一年了。雖然有C語言課,但是老師完全讓我們自己看書,在自學的過程中,和周圍同學交流中,以及後來在CSDN,BCCN,百度知道看帖回帖中,也看到許多C語言新人常遇到的問題與常犯的錯誤。不妨看看吧。以下僅供參考!對於完整的修正後的程序都在code::block...