程序或代码中,有一段能被直接引用的,这部分程序或代码被称作子程序,它就是函数。
有一个规模相对较大的程序,通常情况下,需要把它分划为若干个程序块,每一个程序块,其作用在于去达成某一个特定的功能。全部的高级语言之中,均存在着子程序这一刻画,借助子程序来实现程序块所具有的功能。
在C语言里,子程序是由一个主函数以及若干个子函数所构成的,主函数会调用子函数,子函数之间也能够互相调用,同一个函数能够被一个或者多个函数调用任意的次数。
于程序设计里头,通常会把一些常常会用到的程序块撰写成函数,放置于函数库当中以供公共去使用。用户能够借助这些函数,从而降低重复编写程序块的工作量。
C语言函数的定义,简单来讲,函数便是执行一项任务的一组语句,每个C语言程序都起码有一个函数,也就是主函数main(),函数定义告知编译器函数的返回类型、名称以及参数,函数定义给出函数的实际主体。
C 语言中函数定义的一般形式如下:
info-box
返回值类型 函数名(参数列表)
{
函数主体;
}
以下是对一个函数组成部分的介绍哦,在C语言程序里,该函数的使用情况是,一旦程序调用函数,那么程序控制权就会转移至被调用的那个函数处。
已定义具体任务的函数被调用去执行,当函数里头的返回语句得以执行之际,或者等到抵达函数的结束括号之时,程序控制权就会交还给主程序。
在进行函数调用这个行为的时候,主程序会去传递那些所需的参数,要是函数存在返回值的情况,那么就能够把返回值传递给调用它的那个主程序。
- 要是函数打算使用参数,那么就得声明能接受参数值的变量,而这些变量被称作函数的形式参数,函数参数就是这样。
形式参数这种东西,跟函数内部的其他局部变量类似,于进入函数这个时刻被创建,在退出函数的那个时候被销毁。
在默认状况之下,C程序运用传值调用这种方式去传递参数,此情形下,仅仅是把主程序里的变量值传递过去,并不会对主程序的变量作出改变。
- 用来定义函数时参数表的形式参数(简称为形参)指出的只是调用函数时参数的个数,以及类型,还有用来引用的名字,根本不存在具体的内容。
当形参没有被调用的时候,它是不会占用存储单元的。形参仅仅是在调用的过程当中,才会去占用存储单元。
拥有确定值的实际参数,也就是简称为实参的,在调用函数这个行为得以持续实现的进程里,会把自身所具备的值赋予给形参。简单扼要地讲,在函数进行定义之时,于函数首部位置出现的参数被称作形参,而在调用函数之际所运用的参数则被叫做实参,这二者相互之间所存在的区别跟联系展现情况如下:
当调用函数时,有两种向函数传递参数的方式,如下表所示。
表:参数传递方式调用类型描述
传值调用
把实参的值投放给函数的形参,然而更改函数内部的形参并不会对主程序之中就是实参的变量造成影响。
引用调用
以运用指针传递的途径,形参指向的数据是主程序里实参的地址,一旦针对形参开展操作起来,那便是可以等同于对实参自身进行运转的操作(此情形等同于对主程序中的由变量所构成的元素进行运作的操作)。
交换函数里头两个整数的值,并将这两个整数借助第三个临时变量来进行交换。
c
#include
void swap(int i_a, int i_b) /*函数定义*/
{
int temp;
temp = i_a; /*保存地址 i_a 的值*/
i_a = i_b; /*把 i_b 赋值给 i_a*/
i_b = temp; /*把 temp 赋值给 i_b*/
return; //该函数无返回值
}
int main ()
{
int i_a = 100;
int i_b = 200;
printf("交换前i_a, i_b 的值: %d, %d\n", i_a, i_b);
swap(i_a, i_b); /*调用函数交换值*/
printf("交换后i_a, i_b 的值: %d, %d\n", i_a, i_b);
return 0; //也可以写成return (0),即()可省
}
编译运行,结果如下:
交换前i_a, i_b 的值: 100,200
交换后i_a, i_b 的值: 100,200
程序于调用子函数之际,会针对 i_a、i_b 另行开辟内存空间,且会把实参的值复制至 i_a、i_b 之中,而后于 swap() 函数里,i_a、i_b 的值的确出现了交换情况,可这与主程序里的 i_a、i_b 没有丝毫关联,i_a、i_b 并未产生任何改变。子函数调用完毕后,形参所占的内存会自动予以释放。
如何在子函数里引用调用函数去交换主程序之中两个变量的值,我于《C语言指针,变量当作函数参数》这篇文章内做了详尽的讲解。
在实例里,函数声明处在主程序上方,函数定义同样在主程序上方;函数声明能够在主程序之中,之后于主程序结束以后再去进行定义;又或者在主程序上方予以声明,随后在主程序结束之后再开展定义。当中后两种方式的代码如下:
c
#include
int main ()
{
int i_a = 100;
int i_b = 200;
void swap(int i_a, int i_b); //只声明不定义
printf("交换前i_a, i_b 的值: %d, %d\n", i_a, i_b);
swap(i_a, i_b); /* 调用函数交换值*/
printf("交换后i_a, i_b 的值: %d,%d\n", i_a, i_b);
return 0;
}
void swap(int i_a, int i_b) /*函数定义*/
{
int temp;
temp = i_a; /*保存地址 i_a 的值*/
i_a = i_b; /*把 i_b 赋值给 i_a*/
i_b = temp; /*把 temp 赋值给 i_b*/
return; //该函数无返回值
}
或者如下:
c
#include
void swap(int i_a , int i_b); //只声明不定义
int main ()
{
int i_a = 100;
int i_b = 200;
printf("交换前i_a, i_b 的值: %d, %d\n", i_a, i_b);
swap(i_a, i_b); /*调用函数交换值*/
printf("交换后i_a, i_b 的值: %d, %d\n", i_a, i_b);
return 0;
}
void swap(int i_a, int i_b) /*函数定义*/
{
int temp;
temp = i_a; /*保存地址 i_a 的值*/
i_a = i_b; /*把 i_b 赋值给 i_a*/
i_b = temp; /*把 temp 赋值给 i_b*/
return; //该函数无返回值
}
【实例 2】输入 3 个整数,并将最大值输出。
这个程序,首先输入三个整数,分别是i_x、i_y以及i_z,接着把i_x和i_y当作参数传递给函数GetMax(),从中获取最大值并赋给i_temp,将其作为函数返回值,随后返回给主程序的i_max变量;之后再次调用函数GetMax(),把i_z和i_max作为参数传递给该函数GetMax(),把其中的最大值赋给i_temp,作为函数返回值,再返回给主程序的i_max变量,最后将i_max输出。
c
#include
int GetMax(int i_x, int i_y) //获取二者中的最大值
{
int i_temp;
(a>b)?(i_ temp = i_x):(i_ temp = i_y); //三目运算,将最大值赋给i_temp
return i_ temp;
}
int main(){
int i_x, i_y, i_z, i_max;
printf("请输入三个数字(空格分隔):");
scanf("%d%d%d", &i_x, &i_y, &i_z);
i_max=GetMax(i_x, i_y); //调用函数
i_max=GetMax(i_z, i_max); //再次调用函数
printf("最大数为: %d \n", i_max);
return 0;
}
编译运行,结果如下:
请输入三个数字(空格分隔): 1 22 11
最大数为: 22