函數(shù)
函數(shù)定義
K&R 和ANSI有差別
return expression;
return 語句允許你從函數(shù)體的任何位置返回,并不一定要在函數(shù)體的末尾。expression可以省略,直接來一個return ;這個時候函數(shù)的類型就聲明為void;
函數(shù)聲明
1、原型
(提前判斷我們函數(shù)調(diào)用正確與否的方法)
方式一:
方式二:
如果函數(shù)的原型同時也被#include指令包含到定義函數(shù)的文件中,編譯器還可以確認(rèn)函數(shù)原型域函數(shù)定義是否匹配。
2、函數(shù)的缺省認(rèn)定
對于無法見到函數(shù)原型的情況,編譯器會假定在這個函數(shù)的調(diào)用時參數(shù)的類型和數(shù)量是正確的,它同時會假定函數(shù)將返回一個整形值。對于哪些返回值并非整形的函數(shù)而言,這種隱式的認(rèn)定常常導(dǎo)致錯誤。
函數(shù)的參數(shù)
C函數(shù)的所有參數(shù)均以“按值調(diào)用”方式進行傳遞,這意味著函數(shù)將獲得參數(shù)值的一份拷貝。這里需明確的是函數(shù)傳遞數(shù)組名的時候?qū)嶋H上傳遞的是數(shù)組的指針,這個值是一份指針的拷貝,所以可以影響到原數(shù)組。
ADT和黑盒
如下7.5a和7.5b文件
可變參數(shù)列表
1、stdarg宏
/*
**大凡子寫的可變參數(shù)的demo,用于計算指定數(shù)量的值的平均值
*/
#include
float average(int n_values,...)
{
va_list var_arg;
int count;
float sum=0;
/*
**1、初始化va_list變量
*/
va_start(var_arg,n_values);
for(count=0;count
{
/*
**2、通過指定參數(shù)類型,依次訪問可變按參數(shù)
*/
sum +=va_arg(var_arg,int);
}
/*
**3、訪問完畢最后一個可變參數(shù)后,需要va_end
*/
va_end(var_arg);
return sum/n_values;
}
void main()
{
float a;
a=average(8,1,2,3,4,5,6,7,8);
printf("%f\n",a);
}
2、可變參數(shù)的限制
補充:對于哪些沒有原型的函數(shù),傳遞給函數(shù)的實參將進行缺省參數(shù)提升;char和short類型的實參轉(zhuǎn)換為int,float類型的實參轉(zhuǎn)換為double類型。