一.函数是什么?
维基百科中对于函数的定义为:子程序。
二.C语言中函数的分类:
1.库函数
2.自定义函数
2.1库函数:
C语言中常见的库函数都有:
IO函数,字符串函数,字符操作函数,内存操作函数,时间/日期函数,数字函数,其他库函数
2.2自定义函数
自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
函数的组成:
ret_type fun_name(para1, * )
{
statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1 函数参数
三.函数参数
3.1实际参数(实参)
真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
3.2形式参数(形参)
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完之后就自动销毁。因此形式参数只在函数中有效。
四.函数的调用:
4.1传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
4.2传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接作函数外部的变量。
五.函数的嵌套调用和链式调用
函数和函数之间可以根据实际的需求进行组合,也就是互相调用。
5.1嵌套调用
#include
void new_line()
{
printf("hehe\n");
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
函数可以嵌套调用,但是不能嵌套定义。
5.2链式访问
把一个函数的返回值作为另外一个函数的参数
#include
#include
int main()
{
char arr[20] = "hello";
int ret = strlen(strcat(arr,"bit"));//这里介绍一下strlen函数
printf("%d\n", ret);
return 0;
}
#include
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
//结果是啥?
//注:printf函数的返回值是打印在屏幕上字符的个数
return 0;
}
六.函数的声明和定义
6.1函数的声明:
函数的声明一般出现在函数的使用之前。要满足先声明后使用。
6.2函数的定义:
函数的定义是指函数的具体实现,交代函数的功能实现。
七.函数递归
7.1什么是函数递归?
程序调用自身的编程技巧称为递归。递归作为一种算法在设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来解决。
递归的主要思考方式在于:把大事划小。
7.2递归的两个必要条件
存在限制条件,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件。
八.代码实现练习
1.二分查找的函数编程
#include
int Num_Find(int arr[], int k,int l)
{
int left = 0;
int right = l - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] > k)
right = mid - 1;
else if (arr[mid] < k)
left = mid + 1;
else
return mid;
}
return -1;
}
void Arr_input(int p[],int l)
{
int* k = p+l-1;
for(;p<=k;p++)
{
scanf_s("%d", p);
}
}
int main()
{
int arr[1000] = {0};
int k=0;
int l=0;
printf("输入数组长度->");
scanf_s("%d", &l);
printf("输入数组\n");
Arr_input(arr,l);//输入数组的函数
printf("输入需要查找得数—>");
scanf_s("%d", &k);
int ret = Num_Find(arr,k,l);//函数输出为下标,输出为-1是便没有找到
if (ret == -1)
{
printf("\n没有找到这个数");
}
else
printf("\n找到这个数为arr[%d]", ret);
return 0;
}
示例1:

示例2:

2.用函数递归由大到小输出一个数的各位
#include
void Print(int a)
{
if(a>9)
{
Print(a/10);
}
printf("%d ",a%10);
}
int main()
{
int a = 0;
scanf("%d", &a);
Print(a);
return 0;
}
示例:
3.用函数递归求字符串长度
#include
int Lenght(char* arr)
{
if (*arr != '\0')
return 1 + Lenght(arr + 1);
else
return 0;
}
int main()
{
char arr[10] = {0};
scanf("%s", arr);
int a=Lenght(arr);
printf("%d", a);
return 0;
}
示例: