函數(shù)的參數(shù)分為形參和實(shí)參兩種。
為什邡等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及什邡網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為做網(wǎng)站、成都網(wǎng)站制作、什邡網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,離開(kāi)該函數(shù)則不能使用。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參變量也不能使用。
形參和實(shí)參的功能是作數(shù)據(jù)傳送,發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。
舉個(gè)例子:
定義一個(gè)函數(shù)s=f(a,b),功能是將a和b的差賦值給s,那么,a和b就是這個(gè)函數(shù)的兩個(gè)參數(shù)。
擴(kuò)展資料:
C語(yǔ)言的參數(shù)傳遞方式
方法有3種方式:值傳遞、地址傳遞、引用傳遞
tips:
被調(diào)用函數(shù)的形參只有函數(shù)被調(diào)用時(shí)才會(huì)臨時(shí)分配存儲(chǔ)單元,一旦調(diào)用結(jié)束占用的內(nèi)存便會(huì)被釋放
值傳遞和地址傳遞,傳遞的都是實(shí)參的一個(gè)拷貝
C語(yǔ)言中實(shí)參和形參之間的數(shù)據(jù)傳遞是單向的“值傳遞”,單向傳遞,只能由實(shí)參傳給形參,反之不行
輸出格式并沒(méi)有選擇%p而是選擇了%d,因?yàn)槭M(jìn)制的數(shù)看起來(lái)更直觀。
值傳遞
如果只是傳遞值的話:
#include stdio.h
//值傳遞傳值
void swap( int x, int y);
int main()
{
int a=2,b=3;
printf("before:實(shí)參為a,b\na=%d,地址為%d\nb=%d,地址為%d\n\n",a,a,b,b);
swap(a,b);
printf("after:實(shí)參為a,b\na=%d,地址為%d\nb=%d,地址為%d\n\n",a,a,b,b);
return 0;
}
void swap(int x,int y)
{
int tmp;
tmp=x;
x=y;
y=tmp;
printf("inside:形參為x,y\nx=%d,地址為%d\ny=%d,地址為%d\n\n",x,x,y,y);
}
C語(yǔ)言的函數(shù)定義格式是:
函數(shù)類型 函數(shù)名稱 ( 參數(shù)列表 )
{
//函數(shù)體
}
函數(shù)聲明,不是說(shuō)明的格式是“函數(shù)定義格式”的第一行,然后加 “;”,即:
函數(shù)類型 函數(shù)名稱 ( 參數(shù)列表 );
特別地,在函數(shù)聲明中的參數(shù)列表中,不需要給出具體的變量名稱,但必須給出每個(gè)變量的類型。
匯編代碼gcc:
第一個(gè)問(wèn)題的匯編:
movl $0,?%ebx
incl %ebx
incl %ebx
incl %ebx
movl %ebx,?8(%esp)
movl %ebx,?4(%esp)
movl %ebx,?(%esp)
call _func
匯編顯示,先將n自增了3次變?yōu)?,然后調(diào)用函數(shù),因此都是3
第二個(gè)問(wèn)題的匯編:
movl $3,?16(%esp)
movl $98,?12(%esp)
movl $2,?8(%esp)
movl $97,?4(%esp)
movl $1,?(%esp)
call _func2
可以看出參數(shù)對(duì)應(yīng)的棧地址應(yīng)該是連續(xù)的
另外,這個(gè)程序在VC6下的結(jié)果完全不一樣:
func for n++
? ?0 ? ? ? ? ?0 ? ? ? ? ?0
12ff2c ? ? 12ff30 ? ? 12ff34
func for ++n
? ?3 ? ? ? ? ?2 ? ? ? ? ?1
12ff2c ? ? 12ff30 ? ? 12ff34
func2
12ff24 ? ? 12ff28 ? ? 12ff2c ? ? 12ff30 ? ? 12ff34
但是最后的地址也是連續(xù)的。
此類問(wèn)題知道上問(wèn)過(guò)多次了,可以說(shuō)沒(méi)有什么意義,結(jié)果與編譯器實(shí)現(xiàn)相關(guān),實(shí)際編程沒(méi)有用處,除非寫(xiě)代碼的人喜歡玩花俏
函數(shù)聲明時(shí)只需寫(xiě)出形參類型。
函數(shù)定義時(shí)必須寫(xiě)出形參類型和變量名。
C語(yǔ)言中的標(biāo)準(zhǔn)函數(shù)printf便使用這種機(jī)制。在聲明不確定形參的函數(shù)時(shí),形參部分可以使用省略號(hào)“…”代替。“…”告訴編譯器,在函數(shù)調(diào)用時(shí)不檢查形參類型是否與實(shí)參類型相同,也不檢查參數(shù)個(gè)數(shù)。
擴(kuò)展資料
示例
例如:
void ConnectData(int i,...)
在上面的代碼中,編譯器只檢查第一個(gè)參數(shù)是否為整型,而不對(duì)其他參數(shù)進(jìn)行檢查。
對(duì)于可變參數(shù)的函數(shù),需要進(jìn)行特殊的處理。首先需要引用 stdarg.h 頭文件,然后利用va_list類型和va_start、va_arg、va_end 3個(gè)宏讀取傳遞到函數(shù)中的參數(shù)值。
這幾個(gè)宏的定義如下(在 ANSI C 中):
type va_arg( va_list arg_ptr, type );
void va_end( va_list arg_ptr );
void va_start( va_list arg_ptr, prev_param )。
網(wǎng)站題目:c語(yǔ)言函數(shù)參數(shù)的規(guī)范 c語(yǔ)言中函數(shù)的參數(shù)
當(dāng)前地址:http://www.ekvhdxd.cn/article10/ddcphgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、App設(shè)計(jì)、做網(wǎng)站、品牌網(wǎng)站建設(shè)、全網(wǎng)營(yíng)銷推廣、虛擬主機(jī)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)