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