函数是C语言的基本模块,通过对函数模块的调用实现特定的功能。
A>函数避免了过长的main函数
B>使代码更美观
C>是可读性更强!
博文内容
#函数的 基础知识
-
函数的理解
函数并不只是数学那样的函数,一个值对另一个值的映射。在C语言里通俗的理解,函数就像是各种颜色。你可以通过不同颜色绘画一幅美丽的画。各种各样的颜色组成各种各样的画。对于函数的不同运用组成不同的程序。画图的颜料可以自己调。那么函数也可以自己定义。当然C语言里也有自己的库函数。是那些牛逼的大佬写的,可以我们调用头文件直接调用,方便快捷。就像一开始的红白蓝绿黑的基础颜色。
-
函数的定义——调颜料
类型 + 函数命(随意定义) + 代码块 + 返回值
//C语言
//example
<1>int <3>example_c (<2>) {
<代码块>
<4>return 0;
}
//<1>这是类型。例如:char , int , void
//<2>这里是函数名称。随自己的兴趣
//<3>这里是形参。
//<4>这里是返回值
-
函数的参数——元素
形参:函数括号里的参数。
实参:定义的变量。实实在在的存在,定义即分配空间。
调用:调用函数,就是使用函数。就是往画图里上色,每个地方的颜色要对应,头发是黑色,嘴巴是红色等。对于函数,对应的形参类型必须对应相应的实参类型。
//C语言
//例子
int example_c2(int num,int num1){//num num1 形参
int sum=0;
sum=num+num1;
return sum;
}
void main(){
int x=2;//实参
int y=2;//实参
int temp=example(num,num1);
printf("两个数的和是:%d\n",temp);
}
!!!注意!!!
一定要先定义或者声名,才能调用函数。就像颜色都没有,怎么上色。
函数对形参的改变是不会对实参进行改变的。
//c语言
void change(int a)//a是形参
{
a += 1;
}
int main()
{
int b = 3;//b是实参
change(b);
}
//这里的 change(b);执行是这样
// change(int a = b)
// 后面就是对 a 进行操作。这里是创建了一个临时变量。在change()调用完了,a也就销毁了
-
参数中的函数——回调函数
当函数作为参数传给另一个函数的时候,这个成为参数的函数,就是回调函数。当然这个参数一定是是个指针。这只是函数指针在作祟…………。函数指针
来认识认识回调函数。
首先我们需要先定义一个类型,也就是一个函数指针类型。当然这个类型根据函数类型和函数参数列表进行区分。
它有两种实现方法:
《1》typedef 返回值类型 (*指针类型名称)(参数列表)
—返回值类型:这是函数的返回值类型。是函数指针指向的函数的返回值类型
—指针类型名称:我们定义的一个类型名称,如:int,char
如:
//返回值是char,参数列表是int和char
typedef char(*p_fun3)(int,char);
《2》返回值类型 (*指针名称) (参数列表)
—返回值类型:指向的函数的返回值类型
------------------------------------------------------------------------------------------------------------------------------
总结:这样指针就可以根据参数列表和返回值不同来区分不同的函数。用typedef是因为我们用类型来定义一个函数指针。
上面《1》是定义一个指针类型,然后在定义一个指针,《2》是直接定义一个指针
例子1:《1》
//函数返回值是char,参数列表是int和char的函数指针
typedef char(*p_fun3)(int, char);
//定义一个函数,它的返回值是char,参数列表是int和char
char fun3(int a, char c)
{
printf("回调~~%d %c\n",a,c);
return c;
}
//我们在另一个函数中把函数当成参数
void runx( int x, char c,p_fun3 fun)
{
fun(x, c);
}
int fun(int x)
{
printf("%d\n", x);
return 0;
}
int main()
{
runx(1, 'c', fun3);
system("pause");
return 0;
}
例子2:《2》
//函数返回值是int,参数列表是int
int (*p_fun)(int) =NULL
//对应的函数
int fun(int x)
{
printf("%d\n", x);
return 0;
}
int main()
{
p_fun = &fun;//这里可以直接写成 run = fun;它会隐式类型转换
p_fun(3);
// 或者
//(*p_fun)(3);
system("pause");
return 0;
}
-
函数的进阶——递归
- 》》》定义
递归的含义就是早函数体内调用自身。递归就像领导兴师问罪,领导找到班主任,班主任找到班长,班长找到学生,问请情况,依次返回,最后从领导那里完成整个解决的方式。
- 》》》条件
存在限制条件,当满足这个限制条件的时候,递归便不再继续。
每次递归调用之后越来越接近这个限制条件
- 》》》举例
//C语言
//错误的例子
int error(int x){
int y=0;
int z=error(y); //没有出口,将不会停止
return z;
}
//正确的例子
int true(int x){
if(x==0){
retutn 0;
}
x--;
retutn true(x)+1;
}
- 》》》运用
》》》递归实现函数实现n^k
//c语言
int power(int n,int pow) {
if (pow==0) {
return 1;
}
if (pow>=1) {
if (pow==1) {
return n;
}
return n*power(n,pow-1);
}
return 0;
}
》》》递归方式实现打印一个整数的每一位
//c语言
void print_x(int n) {
if (n>=10){
print_x(n/10);
}
printf("%d ", n % 10);
}
》》》递归求第n个斐波那契数。
//c语言
int findX(int x) {
if (x<3) {
return 1;
}
else {
return findX(x-1) + findX(x-2);
}
}
》》》递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
//c语言
int sum(int num) {
if (num<10) {
return num;
}
else {
return sum(num/10)+num%10;
}
}
》》》递归求字符串长度
//C语言
int recursive(char* str) {
if (*str == '\0') {
return 0;
}
else {
return 1 + recursive(str+1);
}
}
//非递归
int not_recursive(char* str) {
char* p=str;
int num = 0;
while (*p!='\0') {
++num;
*p++;
}
return num;
}
-
原色红白黑——库函数
- 》》》库函数
大佬们写的函数
在写程序的时候,我们可以直接调用,实现不同的功能。正如使用原色红白黑等调出各种各样的颜色然后绘画出美丽的画卷。
- 》》》常规
- strlen()=====>字符串长度——<string.h>
- Sleep()=====>睡眠函数,延迟输出——<windows.h>
- ststem()====>系统函数——<stdlib.h>
- printf()=====>输出函数——<stdio.h>
- ……
- ……
- 》》》提示
库函数的使用和头文件参考
>>>>>>>>>>>>>请点击我
- 》》》运用
//C语言
#include<stdio.h>
void main(){
printf("hello worldd");
}
-
下面是调用的一个具体的综合的运用