一段程序或代码它能够被程序或代码直接引用这样的程序或代码被称作子程序而这就是函数。一般而言一个规模较大的程序通常应当被划分成若干个程序块每一个程序块专门用以达成一个特定的功能。在所有的高级语言当中均存在子程序这样一个概念借助子程序来达成程序块的功能。C语言里子程序由一个主函数以及若干子函数组成主函数调用子函数子函数之间也能够互相调用同一个函数能够被一个或者多个函数任意次数地调用。将一些常用的程序块编写成函数放置于函数库中以供公共使用这在程序设计里是较为常见的做法。用户能够借助这些函数从而减少重复编写程序块所带来的工作量。C语言函数的定义简要来讲函数是一组执行一个任务的语句每个C语言程序都至少有一个函数也就是主函数main()函数定义告知编译器函数的返回类型、名称以及参数而函数定义给出函数的实际主体。C 语言中函数定义的一般形式如下返回值类型 函数名(参数列表) { 函数主体; }于程序里下面对一个函数的构成部分予以介绍当程序调用函数之际程序的控制权会转移至被调用的那个函数。具有被调用性质的函数去执行已经被定义好了的任务在函数的返回语句被执行的这个时候或者是到达函数的结束括号之际就会将程序的控制权交还给主程序。调用函数之际主程序传导所需参数要是函数存有返回值那么能够把返回值传递给调用它的主程序。1) 若函数需使用参数那么函数就得声明用于接受参数值的变量而这些变量被称作函数的形式参数函数存在参数的情况就得作此声明。形式参数如同函数内部的别的局部变量于进入函数之际被创建在退出函数之时被销毁。在默认情形之下C程序运用传值调用这种方式去传递参数此方式仅仅是把主程序里的变量值传递过去并不会对主程序的变量造成改变。2) 形式参数在定义函数时所涉及的是参数表它被简称为形参其作用仅在于明确调用函数时参数的数量、类型以及用于引用的名字然而它并不具备具体的内容。实际参数呢它和形式参数有所不同。当形参没有被调用的时候它是不会占用存储单元的。形参仅仅是在调用的过程当中才会去占用存储单元。实际参数也就是被简称为实参的这种参数是有着确定的值的在调用函数这个行为的过程当中实参是要把值赋予给形参的。简单来说在函数定义的情况之下函数首部那里的参数被称作形参而调用函数之际所运用的参数被称作实参这二者之间存在的区别以及联系是如下这样的当调用函数时有两种向函数传递参数的方式如下表所示。表参数传递方式调用类型描述传值调用把实参的值给予函数的形参改变函数里的形参不会对实参主程序当中的变量造成影响。引用调用采用指针传递这种方式形参是指向主程序里实参的地址一旦对形参开展操作那就如同对实参自身进行操作这等同于对主程序当中的变量进行操作。在交换函数里对两个整数的值予以交换此交换借助第三个临时变量来达成。#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语言指针变量作为函数参数》这一篇文里面进行了详尽地讲解。在实例当中函数声明处于主程序上方函数定义同样处于主程序上方函数声明能够在主程序里面之后在主程序结束完毕后再去进行定义或者在主程序上方进行声明随后在主程序结束之后再开展定义。其中后面这两种方式的代码如下#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; //该函数无返回值 }或者如下#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 个整数并将最大值输出。首先这个程序进行输入输入的是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输出。#include int GetMax(int i_x, int i_y) //获取二者中的最大值 { int i_temp; (ab)?(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_maxGetMax(i_x, i_y); //调用函数 i_maxGetMax(i_z, i_max); //再次调用函数 printf(最大数为: %d \n, i_max); return 0; }编译运行结果如下请输入三个数字空格分隔: 1 22 11最大数为: 22
C语言函数全解析:定义、组成、使用及参数传递等知识
发布时间:2026/6/2 18:22:47
一段程序或代码它能够被程序或代码直接引用这样的程序或代码被称作子程序而这就是函数。一般而言一个规模较大的程序通常应当被划分成若干个程序块每一个程序块专门用以达成一个特定的功能。在所有的高级语言当中均存在子程序这样一个概念借助子程序来达成程序块的功能。C语言里子程序由一个主函数以及若干子函数组成主函数调用子函数子函数之间也能够互相调用同一个函数能够被一个或者多个函数任意次数地调用。将一些常用的程序块编写成函数放置于函数库中以供公共使用这在程序设计里是较为常见的做法。用户能够借助这些函数从而减少重复编写程序块所带来的工作量。C语言函数的定义简要来讲函数是一组执行一个任务的语句每个C语言程序都至少有一个函数也就是主函数main()函数定义告知编译器函数的返回类型、名称以及参数而函数定义给出函数的实际主体。C 语言中函数定义的一般形式如下返回值类型 函数名(参数列表) { 函数主体; }于程序里下面对一个函数的构成部分予以介绍当程序调用函数之际程序的控制权会转移至被调用的那个函数。具有被调用性质的函数去执行已经被定义好了的任务在函数的返回语句被执行的这个时候或者是到达函数的结束括号之际就会将程序的控制权交还给主程序。调用函数之际主程序传导所需参数要是函数存有返回值那么能够把返回值传递给调用它的主程序。1) 若函数需使用参数那么函数就得声明用于接受参数值的变量而这些变量被称作函数的形式参数函数存在参数的情况就得作此声明。形式参数如同函数内部的别的局部变量于进入函数之际被创建在退出函数之时被销毁。在默认情形之下C程序运用传值调用这种方式去传递参数此方式仅仅是把主程序里的变量值传递过去并不会对主程序的变量造成改变。2) 形式参数在定义函数时所涉及的是参数表它被简称为形参其作用仅在于明确调用函数时参数的数量、类型以及用于引用的名字然而它并不具备具体的内容。实际参数呢它和形式参数有所不同。当形参没有被调用的时候它是不会占用存储单元的。形参仅仅是在调用的过程当中才会去占用存储单元。实际参数也就是被简称为实参的这种参数是有着确定的值的在调用函数这个行为的过程当中实参是要把值赋予给形参的。简单来说在函数定义的情况之下函数首部那里的参数被称作形参而调用函数之际所运用的参数被称作实参这二者之间存在的区别以及联系是如下这样的当调用函数时有两种向函数传递参数的方式如下表所示。表参数传递方式调用类型描述传值调用把实参的值给予函数的形参改变函数里的形参不会对实参主程序当中的变量造成影响。引用调用采用指针传递这种方式形参是指向主程序里实参的地址一旦对形参开展操作那就如同对实参自身进行操作这等同于对主程序当中的变量进行操作。在交换函数里对两个整数的值予以交换此交换借助第三个临时变量来达成。#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语言指针变量作为函数参数》这一篇文里面进行了详尽地讲解。在实例当中函数声明处于主程序上方函数定义同样处于主程序上方函数声明能够在主程序里面之后在主程序结束完毕后再去进行定义或者在主程序上方进行声明随后在主程序结束之后再开展定义。其中后面这两种方式的代码如下#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; //该函数无返回值 }或者如下#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 个整数并将最大值输出。首先这个程序进行输入输入的是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输出。#include int GetMax(int i_x, int i_y) //获取二者中的最大值 { int i_temp; (ab)?(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_maxGetMax(i_x, i_y); //调用函数 i_maxGetMax(i_z, i_max); //再次调用函数 printf(最大数为: %d \n, i_max); return 0; }编译运行结果如下请输入三个数字空格分隔: 1 22 11最大数为: 22