上篇写了C语言中的数组,那接下来就到函数了吧。
函数是C语言程序的基本模块,通过对函数模块的调用实现特定的功能。每个C程序都至少有一个函数,那就是主函数main(),C语言不仅提供极为丰富的库函数,还允许用户建立自己定义的函数,就是说所有的C程序都可以定义其他额外的函数。比如,用户可把自己的算法编成一个个相对独立的函数模块,通过调用的方法来使用函数。
函数繁多,至于有哪些种类,其实分类没有什么严格意义上的原则,一切以函数完成的功能为前提,如:
从函数定义的角度看,函数可分为:库函数和用户定义函数(系统调用、API用户编程接口)从函数的返回值看,函数可分为:有返回值函数和无返回值函数从函数是否需要参数看,函数可分为:无参函数和有参函数
函数的定义
[返回类型]函数名(参数){函数主体/执行语句部分;}
说明:[返回类型]:函数可以返回一个值。这里[返回类型]是函数返回的值的数据类型,有些函数执行的时候只需要让它实现某种功能,而不需要返回值,在这种情况下,返回类型为void。
函数名:用户定义的标识符,代表函数的首地址。
参数:在调用函数时,我们可以向函数传递一个或多个参数。参数是可选的,也就是说,函数可以不包含参数。
函数主体:执行语句,即函数执行任务的语句。
举个例子,这个函数没有参数,也没有返回值,如:
voidmy_hello_fn(void){intnum=10;printf(“num=%d\n”,num);}
再比如,有返回值也有参数的:
传入两个数,返回两个数中比较大的数注意:
1、函数在被调用之前,形参(如图中定义的max()函数的参数a,b)不占用内存;
2、实参可以是常量、变量或表达式;
3、必须指定形参的类型;
4、实参对形参的参数传递是“值传递”,即单向传递,如上面例子,调用max()函数时,传递的是a和b的值,调用完max()函数之后a和b本身的值是不变的。
函数的声明
1、函数的声明和定义是不同的
函数定义是指对函数功能的确立:指定函数名,函数返回值类型,参数类型、函数体。函数声明只对已定义的函数进行说明,包括函数类型名函数名、括号、参数类型、参数名。
2、C语言不允许嵌套定义,如定义一个函数的内部又定义其他函数。
3、C语言允许函数的嵌套调用,在一个被调函数中又调用其它函数及递归调用。
4、主函数与被调函数在同一个文件中时:
被调函数在主函数之前定义,不需要声明库函数不需要声明,但必须用include包含头文件其它情况在进行函数调用之前必须进行声明操作在有些编译器中,被调函数返回值类型为int、long、float时不需要声明,如:
max()返回int型,不声明可以直接使用5、主函数与被调函数不在同一个文件中时,调用前必须进行函数声明。
来看个函数声明的例子:
内部函数与外部函数:
内部函数:一个源文件中定义的函数只能被本文件中的函数调用,而不能被其它文件中的函数调用
定义形式:static类型说明符函数名(形参表)
外部函数:外部函数在整个源程序中都有效
定义形式:extern(可省略)类型说明符函数名(形参表)注:在函数定义中如没有说明extern或static则默认隐含为extern
就写这么多吧,对了,在写函数定义的时候提到了形参,那就在简单了解下吧。
如intmax(inta,intb)函数中,a,b就是形参,就是说如果函数需要使用参数,我们必须声明接收参数的变量,这些个变量就是函数的形式参数。形参的生命周期和我们定义的函数相关,在进入函数时被创建,退出函数时被销毁,如同函数内的其他局部变量。
说到参数,还得说说参数的两种传递方式,即值传递和引用传递
值传递:函数调用时把实参的值传给函数的形参,这时,在函数内部修改形参的值,不会影响实参的值,即改变形参的值,实参的值不会改变。如:
说明:定义了一个函数hello(),在main函数中定义变量a和b,a和b即为实参,初始值a为2,b为1,在hello函数中,改变传进来的a和b的值,a变为,b变为,在调用hello()函数后进行打印,打印结果还是a为2,b为1,这就说明值传递时,改变形参的值,实参的值不会发生改变。
引用传递:通过指针传递参数的一种方式,形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作,如
说明:定义了一个函数hello(),在main函数中定义变量a和b,a和b即为实参,初始值a为2,b为1,传递参数时我们传递a和b的地址,即a,b,hello()函数形参为指向实参地址的指针,我们在函数内部对形参指针变量进行赋值,a变为,b变为,在调用hello()函数后进行打印,打印结果a变为为,b变为,这就说明引用传递时,对形参的指向操作,就相当于对实参本身进行的操作,即改变形参的值,实参的值也会随之改变。
简单写写C中变量的存储类别(也就是变量的作用域)方面相关知识,想了解的小伙们可以