文章目录
1、函数的定义
在C语言中,最基础的程序模块是函数。函数被视为程序中基本的逻辑单位,一个C程序是由一个main()函数和若干普通函数组成。内存
定义一个函数的语法格式以下:编译
返回值类型 函数名([参数类型1 参数名1],[参数类型2 参数名2],[参数类型3 参数名3]...)基础
{
变量
函数体数据类型
......
return 返回值;
}
函数主要包含:返回值类型、函数名、参数类型、参数、函数体、返回值
各部分解析:
返回值类型:用于限定函数返回值类型,当返回类型为void时,return语句能够省略。
函数名:表示函数的名称。
参数类型:用于限定调用函数时传入函数中的数据类型。
参数:用于接收传入函数的数据
return关键字:用于结束函数,将函数的返回值返回函数调用处。
【注意】
若是函数不须要返回值,则函数的返回值类型应被定义为void,函数的返回值就能够省略。
[参数类型1 参数名1],[参数类型2 参数名2],[参数类型3 参数名3]...称为参数列表,若是函数不须要接收参数,参数列表为空,此时函数称为无参函数。
2、参数传递
1.参数
程序在编译或运行时,使用某个函数来完成相关功能,称之为函数调用。函数在被调用时,能够经过函数的参数列表,进行数据传递。函数中的参数有两种,分别为形式参数和实际参数。
(1)形式参数
在定义函数时,函数名后括号中的变量名称为形式参数或虚拟参数,简称“形参”。例以下面函数声明语句:
int func(int a,int b);
变量a和b就是形式参数,这样的形参并不占用实际内存,仅为了标识函数的参数列表而存在。
(2)实际参数
在函数被调用时,函数名后小括号内的参数称为实际参数,简称“实参”。实参能够是常量、变量、表达式。例如如下调用语句:
func(3,5);
此行代码是对函数func的调用,数据‘3’和‘5’分别对应参数列表a和b。当函数被调用时,形参是真正的变量,占用内存空间,此时具体的数据“3”和“5”就被传递给函数参数列表中的变量a和b。在函数调用时,形参获取实参的数据(至关于进行了赋值),该数据在本次函数调用时有效,一旦调用的函数执行完毕,形参的值就会被释放。
【注意】形参和实参的数据传递是单向的,只能是由实参传递给形参,不能由形参传递给实参。
2.传递参数的方式
传递参数的方式有:按值传递和按引用传递两种(值传递和地址传递)
按值传递实参时,程序会将实参建立一个副本,将这个副本传递给被调函数。对这个副本的修改不会影响到主调函数中原来参数变量的值。
按引用传递实参时,主调函数则会容许被调函数修改相应的实参变量的值。
若被调函数不须要修改主调函数中实参变量的值,则应采用按值传递的方式。这样能够防止意外的反作用(变量被修改)。
只有在被调函数须要修改主调函数中的变量而这个被调函数又是可信任的时候,才可使用按引用传递。
【注意】C语言中,全部的实参都是按值传递。若是被传递的参数是一个数组名,而且在函数中使用下标引用该数组的参数,那么在函数中对数组元素进行修改实际上修改的是调用程序中的数组元素。函数将访问调用程序的数组元素,数组并不会被复制。这就是按引用传递,也就是“传址调用”。
数组的这一行为看似与按值传递规则相悖。但其实并不矛盾——数组名其实是一个指针,传递给函数的是这个指针对一个副本。下标引用其实是间接访问的另外一种形式,这个副本上执行间接访问的是原先的数组。
3.函数调用
(1)主函数调用普通函数
(2)嵌套调用
(3)递归调用:函数调用自身。
主函数能够调用普通函数,普通函数能够相互调用,但不能调用主函数。
当调用一个函数时,须要明确函数名和实参列表。要求实参和形参必须知足三个条件:参数个数相等、顺序对应、类型匹配