[1]函数概念
1.1 什么是函数?
能够实现一个特定功能的代码集合,它就是一个函数。
函数在封装的时候要遵从 "高内聚" "低耦合"。
(函数是c语言最基本的组成单元)
1.2 函数三要素:
1.功能唯一
2.输入
3.输出
1.3函数的格式:
<存储类型><返回值类型><函数的名字>(参数列表)
{
语句;
return;
}
/*我的第一份工作遇到过这样的问题,在不同的地方需要用到同样的输出,
但是需要输出的信息比较多,那么用函数市最好的选择了,在一个地方写好,
在其他的地方进行调用,这样可以减少代码量和阅读难度*/
例如:一个不带返回值的输出函数
void hello(void)
{
printf("hello\n");
//return;
}
再例如: 一个带int返回值类型的加法函数
int add(int a,int b)
{
return (a+b);
}
[2]函数的使用
函数的使用:先声明后使用
也就是有两种最常见的用法,因为你要先定义或者声明,才可以进行调用。
比如在函数中你想使用一个变量,那么你就要先进行定义这个变量。
在函数调用也是如此:
1.被调用的函数写在调用函数前面,相当于先进行定义
2.被调函数要是写在后面的话,需要进行声明。
int add(int a,int b)
{
return (a+b);
}
int main()
{
int a;int b;
add(5,6);
}
2.
int add(int ,int );
int main()
{
add(5,6);
}
int add(int a,int b)
{
return (a+b);
}
函数的参数:
1.参数的成员的个数一般小于等于4(效率高)
2.函数的中的参数的名字叫做形式参数
形式参数(函数内部的变量)当函数被调用的时候
分配内存,在函数执行结束的时候,形参所占的内存
就会被释放。
实参数:
在main中定义的变量,int a = 5; int b =100 =>a就是实参
add(a,b);
实际参数可以的变量,常量,表达式,地址。
值传递:不可以交换数据
地址传递:可以交换数据
传递数据:不是将整个数据都传递过去了,
它是将数据的首地址传递过去了。
函数的嵌套使用:
1.函数的嵌套
eg1:计算 s=2^2!+3^2 !
这个实例中我们分析出来变量需要先求平方然后在求阶乘,
所以我分需要写两个函数进行嵌套
int fun2(int k)
{
int mul = 1;
for(;k>=1;k--){
mul *= k;
}
return mul;
}
int fun1(int i)
{
int k;
k = i*i;
k = fun2(k);
return k;
}
2.递归函数 n!
int jiecheng(int k)
{
if(k == 1)return 1;
return k*jiecheng(k-1);
}
[3]函数指针和指针函数
指针函数
:函数的返回值类型为指针类型。
char *hello(int a)
{
char b;
char *p = &b;
return p; 错误;
}
函数指针
:它是一个指针,指向的是一个函数。
int (*p)(int a,int b);
int add(int a,int b)
{
return (a+b);
}
int main(int argc, const char *argv[])
{
int (*p)(int,int) = add; //函数的名字就是一个地址
printf("%d\n",p(5,6));
return 0;
}
回调函数func:
int add(int a,int b)
{
return (a+b);
}
int sub(int a,int b)
{
return (a-b);
}
int func(int a,int b,int (*p)(int ,int ))
{
return p(a,b);
}
int main(int argc, const char *argv[])
{
int (*p)(int,int) = add;
printf("%d\n",p(5,6));
printf("add = %d\n",func(5,6,add));
printf("sub = %d\n",func(5,6,sub));
return 0;
}
函数指针数组
:它是数组,数组内保存的是函数指针
int (*p[3])();
函数指针数组指针:
:它是一个指针,这个指针指向函数指针数组
int (*(*t)[3])();