基本定义
int fnName(int args1){
return int
}
要求
定义了返回值 则必须返回 没有返回值用void
定义了参数 则个数 类型必须一一对应
必须先声明后使用
必须在顶层 不能函数内部再定义函数
不能返回内部变量的 指针,地址
main函数
// 程序的主入口 必有一个
int main (){
return 0; // 0 表示成功 其他值失败
}
参数
如果参数是一个变量 则调用传递时是 变量的拷贝值 而不是变量本身
传值引用 影响不到原始值
如果参数是一个指针 则操作指针 改变变量本身
函数指针
函数 void fn1(int a){}
指针 void (*fn1_p)(int) = &fn1;
void (*fn1_p)(int) = fn1;
调用 *fn1_p(10) == fn1(10)
作用 如果参数或返回值也是一个参数 原型的写法 增强可读性
C中规定 函数名本身就是函数地址
fn1 = &fn1
函数原型
只要程序开头给出函数原型 则函数可以先试用 后实现
exit() <stdlib.h> 终止整个程序
exit(EXIT_SUCCESS); exit(0) 成功退出
exit(EXIT_FAILURE); exit(1) 失败退出
main中exit 等同于return 其他函数中exit 直接就退出了
int atexit(void (*func)(void)); 退出前 再做某些事情
函数说明符
extern 说明该函数是其他文件的函数 需要给出外部函数的原型
默认可以不加
extern int foo(int arg1, char arg2);
static
函数内部的变量只会初始化一次
只能赋值常量 不能赋值变量
void fn1(void){
static int num = 1;
num+=1; // 每次调用会递增 不会从1开始
}
修饰函数本身时 则该函数只能在当前文件中使用
static int fn2(){}
const
参数中表示 函数内部不能修改 这个参数变量
指针特殊
const int* p 不能修改值
int* const p 不能修改地址
const int* const p 都不能改
可变参数
int printf(const char* format, ...);
<stdarg.h> 定义了操作可变参数的宏
va_list
va_start
va_arg
va_end
double average(int i, ...) {
double total = 0;
va_list ap; //初始化可变参数变量
va_start(ap, i); // 定位到第可变参数处
for (int j = 1; j <= i; ++j) {
total += va_arg(ap, double); // 取出可变参数 (如何动态类型?)
}
va_end(ap); // 清理可变参数对象
return total / i;
}