c语言的子函数有什么作用是什么意思,C语言程序中什么是函数

C语言的函数问题是困扰很多学者的问题的,c程序中也有一定的函数的。那么下面一起来看看学习啦小编为大家精心推荐的c程序中的函数,希望能够对您有所帮助。

ea43aa39f44788feddd6dca66b3cb9bc.png

C语言读书笔记:函数

先来看看函数的一般形式,尝试写一个加法的函数:

思路是这样的:首先得有头文件,头文件之后就得写主函数,主函数的内部应该就是加法的过程,我们将所有加法的语句都拿出来组成一个函数。代码如下:

#include

int add(int a, int b);

int main()

{

int result = add(3,5);

printf("sum is %d\n", result);

return 0;

}

int add(int a, int b)

{

int sum;

sum = a+b;

return sum;

}

这是一个最简单的函数,描述了一个加法函数的定义和调用的过程。

int add(int a, int b) 成为函数的首部。

有了首部之后,就得考虑一件事情,将首部复制之后,加上一个分号,粘贴在主函数之前,作为函数的原型声明。试想,我们在主函数里边是不是要先定义变量result才能使用result?那么函数的道理也是一样的,当程序运行到主函数中语句“int result = add(3,5);”的时候,如果向上没有寻找到add()的定义,那么编译器一定就会报错。所以要不然添加函数的原型声明,要不然就将函数的定义直接写在主函数之前。

函数首部int add(int a, int b)中的第一个int,即add之前的这个int称为函数的类型。表明这个函数将要返回一个整数类型的值。这个类型可以是C语言中任何被允许的数据类型,包括void,意为无返回值类型,即这个函数不需要返回任何的值。

函数首部int add(int a, int b)中的add称为函数的名字,简称函数名。

函数首部int add(int a, int b)中int a和int b称为函数的形式参数。这里形式参数理论上可以有无穷多个,当然,现实情况下3-5个就已经算是很多了;形式参数中,即使a和b都是int类型的,也要分别定义才行;形式参数可以在函数中直接使用,无须再次定义;形式参数是用来告诉调用者,你应该给我传递来什么样子的数据,我好利用你给我的数据在函数中进行计算。

int add(int a, int b){}中的{}就是函数体的内容了。函数需要进行的所有的操作都要放在这对大括号中。想必大家也看到了函数体中最后有一条语句是return,这条语句起到的作用就是返回函数计算的结果,在这个程序中就是将加法的结果返回给主函数。需要注意的是,函数的类型和返回值的类型必须严格一致!

函数的定义到此为止,接下来讲讲函数的调用方式。只要定义好函数,通过函数名(实际参数1,实际参数2,实际参数n)这种方式就可以调用函数了。例如主函数中的“int result = add(3,5);”,就是调用了add函数。这里,3和5称为实际参数,即你究竟想让函数帮你计算哪两个数的加法结果,你就在这个括号里边写哪几个数字。必须要严格遵守的规定:实际参数和形式参数必须一一对应,数量应该相同,类型也保持一致。

理解了这几点之后,一个基本的函数就已经可以写出来了。接下来来个题目尝试一下:

输入精度e,使用公式求π的近似值,精确到最后一项的绝对值小于e。公式:π=1-1/3+1/5-1/7+...

代码:

//首先得有头文件

#include

#include //后边要使用到fabs绝对值函数

//然后就是主函数了

int main(void)

{

double pi, e; //定义所需变量

double f_pi(double e); //原型声明。函数名只要符合命名规则即可 //因为要求小于e,所以也将这个e传递过去

printf("enter e: "); //输入的提示

scanf("%lf", &e); // double类型的e对应%lf,记住不要缺少&

printf("pi=%lf\n", f_pi(e) ); // 函数返回的是个double类型的值,直接输出

return 0;

}

double f_pi(double e) //函数首部,形参和实参一定要对应,可以重名

{

int denominator, flag;

double item, sum;

//请注意“先定义,然后赋初值再使用”的好习惯!!!

flag = 1; //负责变换正负符号的变量

denominator = 1; //分母初值为1,第一项的1为1/1

item=1.0; //存放每一项的值

sum=0;

while(fabs(item)>=e) //满足条件就循环

{

item=flag*1.0/denominator; //计算每一项的值。flag控制符号

//1.0必须写出小数位,否则整项就变成一个整型值

sum+=item; //累加

flag = -flag; //符号正负切换

denominator = denominator + 2;//分母递增

}

return sum; //sum的类型和函数的类型必须一致

}

函数的定义和调用其实并不难理解,相信很多人困扰在参数的传递上,接下来总结一下函数参数传递的几种方式:

正常的参数调用,例如int、float、double等一一对应的传递。

无参数,也无返回值。例如下列代码就只是为了输出一些语句。这种做法在语法上是被允许的,但是并不推荐这么写。

void printf()

{

printf("hello world!");

}

3. 参数是数组的名字。我们知道数组的名字是个地址,那么如果实参是数组名的话,我们可以将形参设置成指针,指向实参传递过来的数组的首地址。

4. 参数是指针。如果实参是指针,那么形参肯定也得是指针。保持类型一致即可,然后在函数内部再对指针进行操作。

5. 参数是结构体。如果实参是结构体,一般来说我们使用结构体指针来做形参比较合适。

还是在此分割一下吧,说了这么多,可能很多人在问问什么函数定义这么麻烦,还要定义函数,直接都写在main函数中多方便?

非也!

C语言是一个过程化的语言,C语言中的主函数其实是用来主导程序的进程和数据的流动方向的。如果将主函数写的过于复杂,我们阅读程序的结构就会非常的费力。

C语言中的函数回调

什么是回调函数?

简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

为什么要使用回调函数?

因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型、某些限制条件(如返回值为int)的被调用函数。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值