- 相關(guān)推薦
C語(yǔ)言函數調用與參數傳遞
函數是C語(yǔ)言中的基本組成單位,一個(gè)較大的C程序一般可分為若干個(gè)程序模塊,實(shí)現某一特定功能的模塊主要由函數來(lái)完成。下面是小編收集整理的C語(yǔ)言函數調用與參數傳遞相關(guān)內容,歡迎閱讀,希望大家能夠喜歡。
1、主調函數與被調函數
計算機在執行C程序時(shí)總是從main函數開(kāi)始,如果遇到要調用某個(gè)函數,則主函數稱(chēng)為主調函數,被調用者稱(chēng)為被調函數。一個(gè)C程序可由一個(gè)main函數和若干個(gè)其他函數構成,main函數用來(lái)解決整個(gè)問(wèn)題,它調用解決小問(wèn)題的其他函數,其他函數也可以相互調用。調用者就是主調函數,被調者就是被調函數,應當注意,main函數只能由系統調用。
2、實(shí)際參數與形式參數
在調用有參函數時(shí),主調函數和被調函數之間有數據傳遞關(guān)系。在主調函數中進(jìn)行函數調用時(shí),函數名后面括弧中的參數稱(chēng)為實(shí)際參數,簡(jiǎn)稱(chēng)實(shí)參。在定義函數時(shí)函數名后面括弧中的變量名就是形式參數,簡(jiǎn)稱(chēng)形參。即實(shí)參出現在函數調用中,形參出現在函數定義中。主調函數通過(guò)函數調用將實(shí)參中的數據傳遞給被調函數的形參,從而實(shí)現函數間的數據傳遞。另外實(shí)參與形參進(jìn)行數據傳遞時(shí),系統要求實(shí)參與形參在數量、類(lèi)型、順序應嚴格保持一致,這一點(diǎn)在使用上要特別注意。
3、變量存儲類(lèi)型與作用域
主調函數和被調函數數據傳遞往往要通過(guò)變量進(jìn)行,不同的變量類(lèi)型影響數據的處理結果。C語(yǔ)言中變量按存儲時(shí)分配的空間不同可以分為自動(dòng)變量,寄存器變量,靜態(tài)變量和外部變量。按變量的生命周期可以分為局部變量和全局變量,局部變量是在一個(gè)函數內部定義的變量,在存儲器的動(dòng)態(tài)存儲區進(jìn)行分配空間,作用域只在本函數內部有效,比如在主函數里定義的自動(dòng)變量,寄存器變量,函數中的形式參數等都屬于局部變量,在函數調用時(shí),系統才為其分配存儲空間,函數調用結束后,空間釋放。而對于靜態(tài)型局部變量是程序編譯時(shí)由系統在存儲器的靜態(tài)存儲區為其分配存儲空間,函數調用結束后,空間不釋放,其值要保留到程序退出。全局變量是在程序整個(gè)運行期間都要占用內存,所以它是全程有效,貫穿于主調函數與被調函數全過(guò)程,其值也要保留到程序退出為止。
4、參數傳遞的本質(zhì)與屬性
函數參數傳遞的過(guò)程,本質(zhì)上是一種賦值過(guò)程即值傳遞過(guò)程,在調用函數之前,函數的每個(gè)實(shí)際參數將被復制,復制的值代替對應的形式參數。所以形參實(shí)際上得到的不是實(shí)參本身,而是實(shí)參的值或者實(shí)參所代表的值。因此,如果一個(gè)變量傳遞給一個(gè)函數,這個(gè)變量在調用環(huán)境中所存儲的值并不會(huì )被函數修改,所以形參的值不會(huì )反過(guò)來(lái)影響實(shí)參,即實(shí)參與形參值傳遞是單向性的。這兩個(gè)問(wèn)題是學(xué)習和理解函數參數傳遞的根本,很多學(xué)習C語(yǔ)言的人對這兩個(gè)問(wèn)題不是很理解,下面舉例說(shuō)明函數調用時(shí)參數傳遞過(guò)程。
4.1 數值傳遞
當變量為普通變量時(shí),函數實(shí)參可以是自動(dòng)局部變量,靜態(tài)局部變量,數組元素,寄存器變量,結構體變量,結構體變量成員,常量等形式,函數形參為對應類(lèi)型的變量,調用函數時(shí),由系統給形參分配存儲單元,存放從實(shí)參復制過(guò)來(lái)的數值。函數調用結束后,形參存儲單元釋放。
例題1:
#include
void func1(int x)
{++x;
printf (“%d”,x);
。
int main()
{int n=10;
func1(n);
printf (“%d”,n);
return 0 ;
。
例題1中main函數調用func1函數時(shí),把實(shí)參n的值10(注意不是n)傳給了形參x,x在func1函數中進(jìn)行增1運算, 這時(shí)x的值發(fā)生了改變,但該值不能返回到實(shí)參n中,因為x是func1函數內部定義的變量,屬于局部變量,調用函數時(shí),系統為x變量在存儲器的動(dòng)態(tài)存儲區分配存儲空間,函數調用結束后,x變量被釋放,數值被清,故n值不變,體現了傳值的單向性。
4.2 地址值傳遞
地址值傳遞是指實(shí)參與形參之間傳遞的數據是地址,與數值傳遞不同的是,地址值傳遞的是形參接收實(shí)參地址的復制值,而不是實(shí)參值本身。另外,地址值傳遞方式中系統不為形式參數變量分配存儲空間,這一點(diǎn)也與數值傳遞方式不同。因為函數調用完成數據傳遞后,實(shí)參與形參擁有相同的變量地址,它們指向同一變量單元,該變量在主調函數定義時(shí)已經(jīng)分配了存儲空間,形參只是接收了它的一個(gè)地址值,并沒(méi)有接收變量本身。根據參數類(lèi)型的不同,地址值傳遞方式常見(jiàn)的有如下幾種情況。
4.2.1 實(shí)參為變量地址,形參為指針
例題2:
#include
void func2( int *x,int *y)
{
x=y;
}
int main()
{ int a=2,b=3;
func2(&a,&b);
printf ("%d,%d",a,b);
return 0;
}
例題2中在主調函數中將a,b的地址值傳給了形參指針x和y,在被調函數中將y值賦給了x,這時(shí)x的值發(fā)生了改變,x存放的是y的存儲地址,即x指向3,但是這個(gè)指向并不能返回到主調函數。因為這個(gè)地址值在函數調用結束后被釋放,其值消失。當然,如果想在被調函數中修改主調函數中實(shí)參變量的值,需要修改指針變量x和y所指向的地址中的內容。比如將x=y改為*x=*y,即可達到修改實(shí)參變量的目的,但是必須清楚,雖然被調函數通過(guò)指針可以修改主調函數中的值,但這只是一種間接訪(fǎng)問(wèn)數據的形式而已,實(shí)參向形參傳遞數據的單向性是不變的。
4.2.2 實(shí)參為數組名,形參為指針
在C語(yǔ)言中,數組名是一個(gè)地址,而且是一個(gè)地址常量,它代表的是該數組元素的首地址,不是一個(gè)變量。當使用數組名作為實(shí)參時(shí),實(shí)參的值就是數組的首地址,形參指針接收的也是該數組的首地址,被調函數通過(guò)形參指針的變化來(lái)訪(fǎng)問(wèn)主調函數中數據。
例題3:
#include
void func3( int *x,int y)
{ int i;
for(i=0;i printf("%4d",*x++);
}
int main()
{ int a[5]={1,2,3,4,5},b=5;
func3(a,b);
return 0;
}
例題3中形參有兩個(gè),第一個(gè)表示形參接收一個(gè)整型類(lèi)型的地址,第二個(gè)表示接收一個(gè)整型類(lèi)型的數據,至于實(shí)參是不是一個(gè)指針,是不是一個(gè)整型變量,形式參數并不理會(huì ),只管數據的類(lèi)型是否匹配。而從主調函數中可以看出,實(shí)參為數組名(地址)和整型數據(整型類(lèi)型),符合參數傳遞規則。這樣發(fā)生函數調用時(shí),形參指針指向了數組a的第一個(gè)元素,通過(guò)循環(huán)程序,輸出了數組a的所有元素。
這里還有一個(gè)問(wèn)題,形參指針x在被調函數中的值發(fā)生了變化,這個(gè)值是不會(huì )返回給實(shí)參的,很明顯,實(shí)參中的第一個(gè)參數a是數組名,代表一個(gè)地址常量,肯定不能對它進(jìn)行賦值操作,這里進(jìn)一步驗證了實(shí)參與形參值傳遞是單向性的。
4.2.3 實(shí)參為數組名,形參為數組名
當實(shí)參與形參均為數組名時(shí),這種方式跟其他的地址值傳遞方式是一樣的,系統也是不給形參數組分配內存空間,而是將形參數組名處理成一個(gè)指針,因此形參數組并不存在。當發(fā)生函數調用時(shí),實(shí)參數組只是把首地址賦給形參數組名。這樣形參數組名也指向實(shí)參數組,兩個(gè)數組共同占有一段內存空間。因此通過(guò)改變形參數組元素的值來(lái)達到改變實(shí)參數組元素的目的。
例題4:
#include
void func4(int b[5])
{
b[0]=5;
b[1]=4;
b[2]=3;
b[3]=2;
b[4]=1;
}
int main( )
{int i;
int a[5]={1,2,3,4,5};
func4(a);
for(i=0;i<5;i++)
printf("%4d",a[i]);
return 0;
}
例題中實(shí)參與形參均為數組名,調用函數時(shí),實(shí)參數組的首地址復制后給了形參數組,使形參數組名指向了實(shí)參數組,當改變形參數組元素值時(shí),實(shí)參元素值必然改變,因為實(shí)參數組和形參數組是同一塊存儲單元。
4.2.4 實(shí)參為指針,形參為數組名
4.2.5 實(shí)參為指針,形參為指針
對于(1),(5)這兩種情況比較好理解,實(shí)參為指針,其值為地址,所以形參接收的也是地址,實(shí)參與形參類(lèi)型匹配,可以進(jìn)行數據傳遞,在此不一一介紹。
C語(yǔ)言函數常用知識點(diǎn)
總體上必須清楚的:
1)程序結構是三種:順序結構、選擇結構(分支結構)、循環(huán)結構。
2)讀程序都要從main入口,然后從最上面順序往下讀(碰到循環(huán)做循環(huán),碰到選擇做選擇),有且只有一個(gè)main函數。
3)計算機的數據在電腦中保存是以二進(jìn)制的形式.數據存放的位置就是他的地址.
4)bit是位是指為0或者1。 byte是指字節,一個(gè)字節=八個(gè)位.
概念?嫉降模
1、編譯預處理不是C語(yǔ)言的一部分,不占運行時(shí)間,不要加分號。C語(yǔ)言編譯的程序稱(chēng)為源程序,它以ASCII數值存放在文本文件中。
2、define PI 3.1415926;這個(gè)寫(xiě)法是錯誤的,一定不能出現分號。 -
3、每個(gè)C語(yǔ)言程序中main函數是有且只有一個(gè)。
4、在函數中不可以再定義函數。
5、算法:可以沒(méi)有輸入,但是一定要有輸出。
6、break可用于循環(huán)結構和switch語(yǔ)句。
7、逗號運算符的級別最低,賦值的級別倒數第二。
第一章C語(yǔ)言的基礎知識
第一節、對C語(yǔ)言的基礎認識
1、C語(yǔ)言編寫(xiě)的程序稱(chēng)為源程序,又稱(chēng)為編譯單位。
2、C語(yǔ)言書(shū)寫(xiě)格式是自由的,每行可以寫(xiě)多個(gè)語(yǔ)句,可以寫(xiě)多行。
3、一個(gè)C語(yǔ)言程序有且只有一個(gè)main函數,是程序運行的起點(diǎn)。
第二節、熟悉vc++
1、VC是軟件,用來(lái)運行寫(xiě)的C語(yǔ)言程序。
2、每個(gè)C語(yǔ)言程序寫(xiě)完后,都是先編譯,后鏈接,最后運行。(.c—.obj—.exe)這個(gè)過(guò)程中注意.c和.obj文件時(shí)無(wú)法運行的,只有.exe文件才可以運行。(?迹。
第三節、標識符
1、標識符(必考內容):
合法的要求是由字母,數字,下劃線(xiàn)組成。有其它元素就錯了。
并且第一個(gè)必須為字母或則是下劃線(xiàn)。第一個(gè)為數字就錯了
2、標識符分為關(guān)鍵字、預定義標識符、用戶(hù)標識符。
關(guān)鍵字:不可以作為用戶(hù)標識符號。main define scanf printf都不是關(guān)鍵字。迷惑你的地方If是可以做為用戶(hù)標識符。因為If中的第一個(gè)字母大寫(xiě)了,所以不是關(guān)鍵字。
預定義標識符:背誦define scanf printf include。記住預定義標識符可以做為用戶(hù)標識符。
用戶(hù)標識符:基本上每年都考,詳細請見(jiàn)書(shū)上習題。
第四節:進(jìn)制的轉換
十進(jìn)制轉換成二進(jìn)制、八進(jìn)制、十六進(jìn)制。
二進(jìn)制、八進(jìn)制、十六進(jìn)制轉換成十進(jìn)制。
【C語(yǔ)言函數調用與參數傳遞】相關(guān)文章:
C語(yǔ)言函數參數傳遞問(wèn)題03-30
C語(yǔ)言函數參數傳遞規律11-19
C語(yǔ)言函數的運用及調用05-10
C語(yǔ)言函數的遞歸調用05-17
關(guān)于淺談C語(yǔ)言函數調用參數壓棧的相關(guān)問(wèn)題05-24
C語(yǔ)言main函數的參數07-25
C語(yǔ)言函數的遞歸和調用05-09