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