这里写目录标题
(一),函数是什么?
- 在维基百科中对函数的定义:子程序
- 子程序是一个大型程序中的某部分代码,由一个或多个语句组成。负责完成某项特定的任务,而且相较于其他代码,它具有相对的独立性。
- 一个C语言程序可以由多个函数构成,但主函数只有一个,且函数作用的实现均在主函数中完成。
(二),C语言中函数的分类
1,库函数
C语言的常用的标准头文件有 :
<ctype.h> <time.h> <stdio.h>
<stdlib.h> <math.h> <string.h>
这几种标准头文件中都包含许多库函数
2,自定义函数
-
自定义函数的构造:
函数类型 (同时也是返回值类型) 函数名(自己可以随便编写,命名规则和标识符相同) (参数类型 参数)(可以写多个参数,参数之间用,隔开)
{
语句
} -
自定义函数的几种类型:
(1),int 整数类型
(2),void 无返回值/也可以指明一个通用型指针
(3),char 字符类型
(4),double类型
(5),float类型
(6),short短整型
(7),long长整型
(8),* p指针类型 -
自定义函数可以带参数,也可以不带参数
-
另外函数的表达式也可以作为参数。例如:max(a,max(b,c))
(三),函数的定义,声明,调用与返回
1,函数的定义
结构如下:
数据类型 函数名(形式参数说明) { 函数体 }
以下就是函数的定义的具体形式
int power(int x,int y)//函数定义后面不用加分号 { int i; i = x+y; return i; }
2,函数的声明
函数的声明形式为:
函数类型 函数名(形参类型1 形式参数1,形参类型2 形式参数2…);
- 注意:函数的声明后要加分号
函数声明的目的是告诉编译系统,函数值是什么类型,有多少个形式参数,每一个参数都是什么类型的,为编译系统进行类型检查提供依据
以下就是函数声明的具体形式
#include<stdio.h> //double func(float x,float y);函数的声明也可以在主函数之前 int main() { double func(float x,float y);//func函数的声明 float a,b,c; scanf_s("%d,%d",&a,&b); c = fun(a,b);//函数的调用也可以说函数的实现 printf("%f\n",c); } double func(float x,float y)//函数func的定义 { return(x+y); }
以下列情况可以省略函数声明
(1),当函数的返回值为整型或字符型时,如果在同一个文件中既定义函数,又调用该函数,则不论定义函数与调用函数在源程序中的位置关系如何,都可以省去函数说明。
例如:
#include<stdio.h> //double func(float x,float y)函数的声明不仅可以在主函数内声明也可以在主函数前声明 int main() { //int func(int x, int y);//将函数声明注释后程序仍可以运行,且结果相同 int a, b, c; scanf_s("%d,%d", &a, &b); c = func(a, b);//函数的调用也可以说函数的实现 printf("%d\n", c); } int func(int x, int y)//函数func的定义 { return(x + y); }
(2),如果被调用函数的返回值不是整型或字符型,而是其他类型,如果函数定义和函数调用在同一个文件中,且在源文件中函数定义的位置在调用该函数之前,则可以省去在调用函数中对被调用函数的函数说明
例如:
#include<stdio.h> int add(int x,int y)//函数的定义 { return (x+y); } int main() { int a,b,c; scanf_s("%d,%d",&a,&b); c=add(x,y);//函数的调用也可以说函数的实现 printf("%d,%d",a,b); }
以下这几种情况不能省略函数说明
(1),如果在源文件中函数定义的位置在调用该函数之后,则必须在调用该函数前给出被调用函数的函数声明。
(2),如果函数的定义与调用在两个不同的文件中,则不论函数返回值的类型是什么,在调用该函数之前要给出函数声明。
总结:函数声明一定要在函数调用之前,函数声明后要加分号。
- 在C语言中,函数的定义是平行的,不允许函数的嵌套定义(就是在一个函数内再定义一个新的函数)
- 而函数的调用关系比较自由,允许在一个函数内部调用其他函数,称为函数的嵌套调用,甚至允许在函数的内部调用函数自身(俗称函数的递归)
3,函数返回值
函数调用之后的结果称为函数的返回值,通过return语句将返回值带回调用函数
格式:
return 表达式;
功能:
将表达式的值返回调用函数
函数定义时的类型就是函数返回值的类型
总结:
- 函数返回值只能有一个
- 当函数中不需要返回值时,可以写成:return;
(四),函数之间的数据传递
1,函数参数的传递规则
形参是函数在定义时由用户定义的形式上的变量
实参是函数调用时,调用函数为被调函数的形参提供的原始数据
- 其实在C语言中,实参向形参传数据的方式是"值传递"
- 值传递的过程类似于复印就是将实参中的数据“复印”到形参中
- 所以当你改变形参中的数值大小或交换两个形参中的值,都不会影响到实参中的数值
例如:
#include<stdio.h> void swap(int x,int y); int main() { int i,j; printf("输入你要交换值的两个数: "); scanf_s("%d,%d",&i,&j); swap(i,j); printf("\n交换后两个数分别为:%d,%d",i,j); return 0; } void swap(int x,int y) { int c; c=x; x=y; y=c; }
结果: i和j的值并没有交换
总结:
- 形参在被调用函数中定义,实参在调用函数中定义
- 形参是形式上的,定义时编译系统并不为其分配存储空间,也无初值,只有在函数被调用时,才临时分配存储空间接受实参的值,函数调用结束,内存空间释放,值消失
- 实参可以是变量名或表达式,但必须在函数调用之间有确定的值
- 实参和形参之间是单向的值传,即实参的值传给形参,因此,实参与形参必须类型相同,数量相等,一一对应。