函数的分类
函数组成
函数的参数
- int main (int argc, char* argv[], vhar* envp[]){}
- argc:整型变量,表示命令行参数个数
- argv:指针数组,每个元素指向命令行的每一个参数(字符串)
- envp:指针数组,数组每个元素指向一个环境变量(字符串)
- 函数实现为可变参数,使函数可以接受1个以上的多个参数
- 可变参数必须从头到尾逐个访问,但可以访问半途中停止
- 参数列表至少有一个命名参数,否则无法使用va_start
- 可变参数实现过程是使用宏的封装,这些宏无法直接判断实际存在参数个数和每个参数的类型
- 如果在va_arg中指定了错误的类型,后果是不可预测的
#include <stdio.h>
#include <stdarg.h>
int average (int n, ...) {
va_list arg;
//va_list类型的arg用于访问参数列表未确定部分
int i = 0, sum = 0;
va_start(arg, n);
//调用va_start初始化,将arg设置为指向可变参数的第一个参数
//va_start的参数是va_list变量名和省略号前最后一个有名字的参数
for (i = 0; i < n; i++) {
sum += va_arg (arg, int);
//调用va_arg访问参数,但会这个参数的值并指向下一个可变参数
//va_arg的参数是va_list变量和列表中下一个参数的类型
}
return sum/n;
va_end (arg); //结束访问可变参数
}
int main() {
int a = 1, b = 2, c = 3;
int avg1 = average(2, a,c);
int avg2 = average(3, a, b, c);
printf("avg1 = %d\navg2 = %d\n", avg1, avg2);
return 0;
}
函数传参
- 一维数组传参:数组名相当于首元素的地址
- 二维数组传参(int arr[2][3]):利用数组指针接收(void fun (int (*arr)[3]));利用二维数组接收(void fun (int arr[][3]))
- 多维数组传参:提供除最左边一维之外的其他维度的长度
想修改指针变量(*p)需要用二级指针来接收,实参传当前指针的地址