C语⾔中函数的基本知识
接着上次的数组,这次我们来简单的讲讲C语⾔⾥⾯的函数。
函数和指针这两⼤块,在C语⾔中占据着重要的位置,是C语⾔中的主体和核⼼,所以它们的重要性也就不⾔⽽喻了。
那什么是函数呢?
1:函数是C语⾔的模块,⼀块块的,有较强的独⽴性,可以相互调⽤,也就是说,你可以在函数A中调⽤函数B,⼜可在函数B中调⽤函数C,不仅如此,你还可以调⽤函数⾃⾝(递归)。
2:函数是完成⼀个个特定任务的语句集合,它能完成你所想要的某种特定任务,当你要⽤时,只需要调⽤它即可,在后续的修改或是维护过程中,只需要针对这⼀个进⾏修改即可。
打个⽐⽅来理解函数:
在⼀个饭店⾥⾯,顾客点了⼀盘菜后,服务员把该菜的名字给后勤,他负责洗菜这项功能,完毕后把菜交给配菜的师傅,待菜切好后,把菜交给厨师,厨师负责炒菜,完毕后,服务员把菜端给顾客。
在上⾯那个⽐⽅内,有四个不同的,独⽴的⾓⾊:服务员,后勤,配菜师傅,厨师。
他们每⼀个只是负责给他们指定的任务:
服务员相当于是 main() 主函数,他是整个过程的开始,主函数也被称作 程序的接⼝,我们写的代码都是⾸先从这⾥执⾏下去的。
后勤,配菜师傅,厨师, 相当于三个不同的函数,他们执⾏各⾃的功能,互不影响,并且哪⾥出了问题,很快就可以确定问题的位置。
假如顾客吃到的菜有⼀只青⾍,那我们基本可以确定出问题(bug)的是在后勤部分。
那为什么需要函数呢?
1:在我们写代码的时候,有时候会重复写⼀段代码,⽽这段代码所执⾏的功能,操作是⼀样的,只是针对的数据不⼀样,这个时候,将这段功能写成⼀个函数模块,在需要⽤到的时候调⽤即可,进⽽避免了写重复的代码,避免了重复性操作。
2:⽅便代码的维护,当我们知道哪个部分出问题后,或者需要修改某个功能,那就只需要修改那部分的代码即可。
在上⾯饭店的⽐⽅中,我们⼀下⼦便可知道吃到青⾍时,是哪⾥出了问题。
这⾥,我将上⾯那个例⼦,写成了⼀个点单的⼩程序,将洗菜配菜做菜分别写成了三个不同的函数来演⽰⼀下:
在主函数体外⾯:
这三个分别是独⽴出来的,完成他们各⾃的功能。互不影响,相互独⽴。
若是不写成函数,那么直接在 case语句 后⾯分别写三条 printf ,那将会显得冗长,且如果有部分除了差错,那修改的将是三个,⿇烦。
库函数和⾃定义函数
1: C语⾔为我们提供了上百个可调⽤的库函数,例如与字符串有关的 strlen, strcat, strlwr . 或是我们刚接触C语⾔时候⽤到的 printf, scanf,这些都是c语⾔为我们提供的。在我们使⽤某⼀库函数的时候,需要在程序中嵌⼊(#include<>) 该函数所需要的头⽂件。
这也就是为啥我们在代码开头都需要写上#include <stdio.h>,因为 printf, scanf,getchar,gets,putchar()这些函数 (也称作标准I/O函数),都是在stdio头⽂件中。
2:⾃定义函数就是我们⾃⼰写的,例如我上⾯那个 chef(), coord()
函数的定义
这⾥记住⼀点即可:当你函数定义写在主函数之前的时候,那么就⽆需在主函数⾥⾯声明这个函数,只需要把函数体写在主函数前即可:
⽽若我将exp()写在下⾯:
那编译器将提⽰错误:
如果要写在主函数下⾯,我们则需要告诉编译器,有这个函数的存在:
递归函数c语言规则函数按照是否有参数分为有参类型和⽆参类型
按照是否有返回值也分为有返回值和⽆返回值两种类型。
有参函数 指的是在该函数被调⽤的时候,主调函数通过参数向⾥⾯传递了数据。
⽆参函数 很好理解就是不传递数据,因为没有参数,⽆法获得值。
这⾥着重介绍下 有参函数
它的定义⼀般是:
函数数据类型函数名字(参数1,参数2,参数3,...,参数n)
{
语句块;
}
//函数数据类型可以是 void (空类型,不带返回值的), int, float, double, 指针类型(int *, char *s)
//参数,根据⾃⼰的需要来,你如果想传递浮点类型,那么就需要定义成浮点类型的数据类型(flaot, double)
举例:
//返回两个数字最⼤的⼀个
int max(int n1,int n2)
{
return((n1 > n2)? n1 : n2);
}
//计算三个数字之和
int sum(int n1,int n2,int n3)
{
return n1 + n2 + n3;
}
//计算字符串长度
int_strlen(char*str)
{
int l =0;
while(*(str+l)!='\0'&&++l);
return l;
}
在我们⾃定义的函数⾥⾯,括号⾥⾯的参数叫做形式参数(形参),⽽在主调函数⾥⾯,括号后⾯的参数叫做实际参数(实参),它可以是常量,变量,表达式
例如你在主调函数调⽤max函数的时候可以:
_max =max(12,43);//⼆者都是常量
_max =max(n1 + n2,4*5);//n1 n2为变量,进⾏加法操作也是⼀个表达式
在调⽤函数的时候,需要知道以下⼏点:
1:在调⽤的时候,主调函数向参数传递的是值,在调⽤结束后,该值不改变。
2:函数只有被调⽤,系统才会给它分配内存单元。
3:调⽤结束后,系统给他分配的内存单元⽴即被释放,⽽主调函数中的值不会改变
4:主调函数传递给被调⽤函数值后,被调⽤的函数⾥⾯可以直接⽤该值,但是要记住,值的数据类型要和参数的数据类型⼀⼀对应。
第⼀点:
函数再调⽤的时候,发⽣的是 值传递,也就是把值拷贝⼀份给形参,在形参⾥⾯改变其值并不影响实参的值<;这⾥的值是单向传递的:实参-> 形参 >:
在 exch() 函数中,我试图改变n的值,但是却没有改变,就是因为我仅仅只是把 n = 46 这个值给拷贝⼀份给了 exch() 函数,在此时的exch()函数中,它⾥⾯的n就有了 46这个值