1.函数是什么
大型程序中的某一部分代码,负责完成某项特定的任务
2.函数分类
2.1 库函数
IO函数(输入输出函数) 字符串操作函数 字符操作函数 时间/日期函数 数学函数 其他库函数
2.2 自定义函数
- 例1. 求最大值函数
//函数
int get_max(int a, int b)
{
int z = 0;
if(a>b)
{
z = ;
}
else{
z = b;
}
return z; // 返回z
}
int main()
{
int a = 10;
int b = 20;
//函数的调用
int max = get_max(a, b);
printf('max = %d\n', max);
return 0;
}
3.形参与实参
函数定义中的参数为形式参数,形式参数只在函数内部有效
函数调用时的参数为真实参数,可以是常量、也可以是变量,也可以是表达式,但必须能够可以求出确定的值
函数的调用分为:传值调用与 传址调用
- 例2. 交换两个整形的内容
//交换两个整形的内容
//函数 前面是void时表示不需要返回值
//correct
void swap1(int* pa, int* pb)
{
int c = 0;
c = *pa;
*pa = *pb;
*pb = c;
}
//wrong
void swap2()
{
int c = 0;
c = a;
a = b;
b = c;
}
//这里没有交换的原因是因为形参是实参的一份临时拷贝,故直接改变形参不会影响实参,所以需要通过指针变量来操作实现
//要通过交换地址来实现值的交换
int main()
{
int a = 10;
int b = 20;
//传值调用
swap2(a, b);
printf("交换前:a=%d, b=%d", a, b);
//传址调用
swap1(&a, &b);
printf("交换后:a=%d, b=%d", a, b);
return 0;
}
4.函数实例
- 例3. 判断100以内的素数并打印
//思路:2 -> n-1 之间两个数相乘可以得到 n
int is_prime(int i)
{
int n = 0;
for (n = 2; n < i; n++)
{
if (i % n == 0)
return 0;
}
return 1;
}
int main()
{
int i = 0;
for (i = 1; i <= 100; i++)
{
if (is_prime(i) == 1)
//if(i%2==0)
{
printf("%d是素数\n", i);
}
}
return 0;
}
例4. 打印2000-2022年间的闰年
int is_leap_year(int year)
{
if ((year%400 == 0) ||(year%100 != 0 && year%4 == 0))
{
return 1;
}
return 0;
}
int main()
{
int year = 0;
for (year=2000; year <= 2022; year++)
{
if (is_leap_year(year) == 1)
{
printf("%d 是闰年\n", year);
}
else
printf("%d 不是闰年\n", year);
}
return 0;
}
- 例5. 二分查找
//整形有序数组的二分查找
int binary_search(int arr[], int key, int sz)
{
int left = 0;
int right = sz - 1;
while (left <= right) //表明中间还存在元素未被查找到
{
int mid = (left + right) / 2;
if (arr[mid] > key)
{
right = mid - 1;
}
else if(arr[mid] < key)
{
left = mid + 1;
}
else
{
return mid;
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9};
int key = 7;
int sz = 0;
sz = sizeof(arr) / sizeof(arr[0]); //函数调用传递数组是之传递数组的第一个元素的地址,所应该先求出数组个数再传入
int rst = binary_search(arr, key, sz);
if (rst != -1)
{
printf("找到了,下标记是:%d\n", rst);
}
else
{
printf("没找到");
}
return 0;
}
- 例6. 每次调用该函数就使得 num 值 +1
void Add(int *p)
{
(*p)++;
}
int main()
{
int num = 0;
Add(&num);
printf("%d\n", num);
Add(&num);
printf("%d\n", num);
Add(&num);
printf("%d\n", num);
return 0;
}
4.函数的嵌套调用和链式访问
函数可以嵌套调用但是不能嵌套定义 把一个函数的返回值作为另一个函数的参数
5.函数的声明和定义
//函数的定义和声明
int main()
{
int num1 = 10;
int num2 = 20;
//声明函数 -- 告知 1.函数返回类型、2.参数个数、3.参数类型 (一般放在头文件中)
int Add(int, int);
Add(num1, num2);
return 0;
}
//函数的定义
int Add()
{
return 0;
}
















