前言
C中所有函数都是平行的,即相互独立,在一个函数中不能嵌套定义另一个函数,函数间可以互相调用,但main()函数不能被调用。
所有的C代码中必须有一个main()函数
一、🎃函数定义
- 函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。
- 定义函数的时候一切以功能为目的,根据功能去定义函数的参数和返回值
- 函数就是将特定功能的代码封装在一个函数内部,当要使用这些代码时,只需要通过函数名就可以使用,这样操作更加方便。
函数分类:
—— 从定义角度分类
- 库函数(c库实现的)
- 自定义函数(自己定义)
- 系统调用(操作系统实现的函数)
——从参数角度分类
- 有参函数
- 无参函数——从返回值角度
- 带返回值
- 无返回值
①、函数定义形式
㈠、函数头:
- 返回值类型
- 函数名
- 形式参数列表
㈡、函数体
由{}大括号括起来。
int AddTwoNumber(int iNum1, int iNum2)
{
int sum;
sum = iNum1+ iNum2;
return sum;
}
㈢、特殊情况
- 无参函数
无参函数没有参数的函数
返回值 函数名()
{
函数体
}
void ShowTime()
{
printf("....");
}
- 空函数
空函数什么都没有做的函数,
类型说明符 函数名()
{
}
void Show()
{
}
注意:
函数名字是标识符,所以要满足标识符的命名规则
形参:可以有,也可以没有,即使没有,函数名字后面必须加大括号
函数体上下位置必须有大括号
如果要返回函数,极返回值,则return后的变量或值,必须与函数名左边返回值类型一致
形参必须带类型,且逗号隔开
函数的定义不能嵌套,即不能在一个函数体内定义另外一个函数
所有函数的定义是平行的
在一个程序中,相同函数名只能定义一次
//无参无返回值
void fun1()
{
printf("HEllo!");
printf("welcome to ?");
}
//定义有参数
void fun2(int a, int b)
{
int sum;
sum = a + b;
printf("%d + %d = %d",a , b, sun);
}
//定义有参数有返回值
int fun3(int a, int b)
{
int sum;
sum = a + b;
return sum;
}
②、定义与声明
int ShowNumber(int num);
🙃如果将函数的定义放在调用函数之前,那就不需要运行运行函数的声明,此时函数的定义就包含函数的声明。
声明的方法:
——什么时候需要声明?
ⅰ、主函数和被调函数在同一个文件中
- 主调函数和被调函数在同一个.c文件中,被调函数在上,主调函数在下不需要声明
- 被调函数在下,主调函数在上需要声明
#include <stdio.h>
//函数的声明:一般当子函数在主函数的下方,需要在主函数的上方进行声明
void fun1();
void fun2(int a, int b);
int fun3(int a, int b);
void main()
{
//函数调用
//函数在调用时没有参数,必须加括号
//函数调用时无返回值,不用加返回值类型
fun1();
}
//无参无返回值
void fun1()
{
printf("HEllo!");
printf("welcome to ?");
}
//定义有参数
void fun2(int a, int b)
{
int sum;
sum = a + b;
printf("%d + %d = %d",a , b, sum);
}
//定义有参数有返回值
int fun3(int a, int b)
{
int sum;
sum = a + b;
return sum;
}
ⅱ、主函数和被调函数不在同一个文件中
一般用间接声明法——将函数的声明放在头文件中,.c程序包含头文件
fun.c
#include "fun.h"
void fun1()
{
printf("HEllo!");
printf("welcome to ?");
}
fun.h
#ifndef FUN_H
#define FUN_H
void fun1();
#endif
main.c
#include <stdio.h>
void main()
{
//函数调用
//函数在调用时没有参数,必须加括号
//函数调用时无返回值,不用加返回值类型
fun1();
}
二、🎃了解返回语句
常见的警告提示:
return 0;
返回语句用途:
- 返回语句能够立刻从函数中退出,回到调用程序中
- 返回语句能返回值,将函数值赋给调用的表达式,
①、从函数返回
存在两种方式:
- 1、在函数体中,从头执行到尾部,程序遇见结束符“ } ” 返回
- 2、采用函数返回语句 :
return (表达式);
函数值类型和return语句中表达值不同。以返回值类型为准。
三、🎃传递函数参数
①、形参与实参
形参:形式参数,用于保存实参传递的值,本质跟实参没有任何关系,只是值传递
实参:实际参数,本质就是在函数调用的时候将实参的值传递给形参
②、数组做函数参数
数组作为函数的参数时,只传递数组的地址,而不是将整个数组赋值到函数中去。当用数组名作为实参调用函数时,则指向该数组的第一个元素指针就被传递到函数中。
- 1、 使用数组元素作为函数参数
main()
{
int i, n;
float ar[10];
n=5;
......
avg(ar, n);
}
float avg(float array[], int n)
{
int i;
float sum;
for(i = 0; i < n; i++)
{
sum += array[i];
}
}
- 2、使用数组名作为函数参数
main()
{
int i, n;
float ar[10];
n=5;
......
avg(ar, n);
}
float avg(float array[10])
{
int i;
float sum;
for(i = 0; i < 10; i++)
{
sum += array[i];
}
}
- 3、使用指针作为函数参数
void Functoion(int* piont); /*声明函数*/
int array[10]; /* 定义数组*/
Function(array); /*将数组名作为实参传递*/
③、了解main 函数的参数
main(int argc, char* argv[])
- argc:保存命令行的参数个数
- argv:指向字符指针数组的指针,在此数组中的每一个元素都指向命令行实参,所有命令行实参都是字符串,任何数字都必须由程序转变成适当格式。
四、🎃调用函数 (使用函数)
①、调用方式
函数的调用方法:
- 变量 = 函数名(实参列表); // 带返回值
- 函数名(实参列表);//不带返回值
Display(); //显示一条信息
iResult = iNum * AddTow(3, 5);
iResult = AddTow(10, AddTow(3, 5));
#include <stdio.h>
//函数的声明:一般当子函数在主函数的下方,需要在主函数的上方进行声明
void fun1();
void fun2(int a, int b);
int fun3(int a, int b);
void main()
{
//函数调用
//没有参数也没有返回值
//直接写函数名,并且要在后面加括号
fun1();
//有参数 没有返回值
//直需要在函数名右边括号中传入参数,参数可以是常量表达式,也可以是变量表达式
fun2(100, 200);
int x = 10, y = 20;
fun2(10, 20);
//有参数 有返回值
//可以使用一个变量接收函数执行结果,或者直接输出
int n;
n = fun3(100, 90);
printf("%d\n", n);
printf("%d\n", fun3(200, 90));
}
//无参无返回值
void fun1()
{
printf("HEllo!\n");
printf("welcome to ?\n");
}
//定义有参数
void fun2(int a, int b)
{
int sum;
sum = a + b;
printf("%d + %d = %d\n",a , b, sum);
}
//定义有参数有返回值
int fun3(int a, int b)
{
int sum;
sum = a + b;
return sum;
}
②、嵌套调用
函数的定义都是互相平行、独立的,在定义函数时一个函数体内不能包含定义的另一个函数。
提示:
C语言不允许进行嵌套定义,可以嵌套调用函数
void ShowMSG()
{
printf("The ");
}
void Display()
{
ShowMSG\();
}
嵌套过程,例子: CEO下达指令
③、递归调用
递归函数又称为自调用函数,每个函数可直接或间接调用自己。
五、🎃灵活应用函数
合理应用函数解决问题,会使程序更加直观易懂,易于修改
常见函数
①、math .h
数学函数:
abs():求整数的绝对值
labs():求长整数的绝对值
fabs():返回实型绝对值
三角函数
sin():正弦函数
cos():余弦函数
tan():正切函数
②、ctype .h
字符和字符串函数
isalpha():检测字母
isdigit():检测数字
isalnum():检测字母或数字
六、🎃函数总结
定义函数时,关于函数的参数和返回值的情况,完全取决于函数的概念
当编写函数时,一开始不用想函数如何传参和函数的返回值是什么?
而是在编写代码的途中,要使用某些值,但是当前函数中不存在,此时就需要进行传参,这时候考虑怎么传参就是合适的时机
当函数编写完毕后,考虑是否要将某些结果返回给其他函数去使用,此时需要考虑返回值。
编写函数的好处?
1.定义一次,多次调用,减少代码冗余度
2.使代码,模块化更好,方便调试程序,阅读方便。