1.自定义函数
ret_type fun_name(para1,*) //ret_type返回类型 fun_name函数名 para1函数参数
{
statement;//语句项
} //在main函数中,调用函数时,要传几个变量过去就在函数括号中输入几个,
同时在定义函数 时也要接收相应的函数参数
例子:二分查找法
int binary_search(int arr[], int k,int sz)//该处的arr是一个指针(存储地址)
{
//int sz = sizeof(arr) / sizeof(arr[0]);//在计算指针大小时64位下大小为8,因此该处的sz结果
//为1,因此在该处计算的元素个数不正确,要在main函数中计算好后传给形参
int left = 0;
int right = sz - 1;
while (left <= right)
{
int ret = (left + right) / 2;//在while循环外就得不到重置,ret会始终保持初始值,因此无
//法出结果
if (arr[ret] > k)
{
right = ret - 1;
}
else if (arr[ret] < k)
{
left = ret + 1;
}
else
{
return ret;
}
}
return 1;
}
int main()
{
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
int k = 7;
int sz = sizeof(arr) / sizeof(arr[0]);
int sum= binary_search(arr, k,sz);//数组在传参的时候,只是传了数组中第一个元素的地址
if (sum == 1)
{
printf("找不到指定下标\n");
}
else
{
printf("找到了,下标是:%d\n", sum);
}
return 0;
}
形参:函数名后括号中的变量,形式参数只有在被函数调动的过程中才被实例化,受实参控制,实参无传值时,形参无值,只在函数中有效。形参实例化时是实参的一分拷贝
实参:真实传给函数的参数,可以是常量,变量,表达式,函数等,无论实参为何种类型,在进行函数调动时,实参都要有确定的值传给形参
传址调用:把函数外部创建的内存地址传递给函数参数的一种调用函数形式,可以让函数和函数外的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量,用于想在函数内部对函数外部进行操作
嵌套调用:函数之间可以套娃
链式访问:一个函数的返回值可以作为另一个函数的参数
引用自己创建的文件,头文件写法为:#include"文件名.h"
函数的声明放在.h文件中,函数的定义放在.c中(分解编程步骤)
函数要先声明后使用,放于头文件中
函数定义是函数的具体实现,交代函数的功能实现
2. 递归:
大事化小 将大问题化为多个相等的小问题,重复解决小问题以完成大问题。。可以用数列的递推公式思想解决
常见错误 stack overflow栈溢出
递归两个必要条件
1.存在限制条件,当满足这个条件的时候,递归便不再继续
2.每次递归调用后都越来越接近这个条件
例子:strlen函数的实现
int my_srtlen(char* sty)//递归计算字符长度
{
if (*sty != '\0')
{
return 1 + my_srtlen(sty + 1);
}
else
{
return 0;
}
}
int main()
{
char arr[] = "hello world";
int let = my_srtlen(arr);
printf("let=%d", let);
return 0;
}