一、函数的概念
这个是简单一点的理解:函数是c语言的功能单位,实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。函数就是讲特定功能的代码封装在一个函数内部,当要使用这些代码时,只需要通过函数名就可以使用,这样操作起来更加方便
这个是详细的理解:
在 C 语言中,函数是一种用于执行特定任务或操作的独立代码块。函数可以接受输入参数(也称为参数)并返回一个值作为结果。函数的使用有助于模块化程序,使代码更易于理解、维护和重用。
以下是关于 C 语言函数的一些重要概念:
函数声明:在使用函数之前,需要提前声明函数。函数声明包括函数的返回类型、函数名以及参数列表(如果有参数)。函数声明通常在程序的开头或使用函数之前进行。
函数定义:函数定义包括函数的实际实现,即函数的具体代码。函数定义包括函数头和函数体。函数头包括函数的返回类型、函数名和参数列表,函数体包括函数的具体实现代码。
函数参数:函数可以接受零个或多个参数作为输入。参数是在调用函数时传递给函数的值。参数可以是任何数据类型,包括基本数据类型(如整数、浮点数)和复杂数据类型(如数组、结构体)。
函数返回值:函数可以返回一个值作为结果。返回值的类型由函数声明中的返回类型指定。如果函数不需要返回值,可以使用
void
关键字表示。函数调用:要使用函数,需要在程序中调用函数。函数调用包括函数名和传递给函数的参数列表。在调用函数时,程序会跳转到函数定义处执行函数体,然后返回结果。
递归函数:C 函数可以是递归的,即函数可以调用自身。递归函数在解决某些问题时非常有用,但要小心避免无限递归。
函数原型:函数原型提供了函数的声明,但没有函数的具体实现。函数原型通常用于在文件之间共享函数声明,以便在一个文件中定义函数,在另一个文件中使用函数。
函数指针:函数指针是指向函数的指针变量。通过函数指针,可以动态地选择要调用的函数,这在某些情况下非常有用,例如在回调函数中使用。
函数是 C 语言中非常重要的概念,它们使程序更具结构化、模块化和可维护性。通过合理设计和使用函数,可以提高代码的可读性和重用性。
二、函数的分类
1、从定义角度分类(即函数是谁实现的)(1)库函数 (c库实现的)(2)自定义函数 (程序员自己实现的函数)(3)系统调用 (操作系统实现的函数)
2、从参数角度分类(1)有参函数函数有形参,可以是一个,或者多个,参数的类型随便完全取决于函数的功能
int fun(int a,float b,double c)
{
}
int max(int x,int y)
{
}
( 2)无参函数函数没有参数,在形参列表的位置写个void或什么都不写
int fun(void)
{
}
int fun()
{
}
3、从返回值角度分类(1)带返回值的函数在定义函数的时候,必须带着返回值类型,在函数体里,必须有return如果没有返回值类型,默认返回整型。
char fun()//定义了一个返回字符数据的函数
{
char b='a';
return b;
}
fun()
{
return 1;
}
(2).没返回值的函数在定义函数的时候,函数名字前面加void
#include <stdio.h>
int max(int x,int y)
{
int z;
if(x>y)
z=x;
else
z=y;
return z;
1}
void help(void)
{
printf("*********************\n");
printf("********帮助信息*****\n");
printf("*********************\n");
}
int main(int argc, char *argv[])
{
int num;
help();
num = max(10,10+5);
printf("num=%d\n",num);
return 0;
}
运行结果:
三、函数的定义
1、函数的定义方法返回值类型 函数名字(形参列表){//函数体,函数的功能在函数体里实现}
函数名字是标识符,所以需要满足标识符的命名规则形参:可以有,也可以没有,也可以有多个,但是即使没有,函数名字后面也必须 加括号函数体上下位置必须有大括号如果要返回函数执行的结果,也就是返回值,则return后面跟的变量或者值,必须与函数名左边的返回值类型一致形参必须带类型,而且以逗号分隔函数的定义不能嵌套,即不能在一个函数体内定义另外一个函数, 所有的函数的定义是平行的。在一个程序中,相同的函数名只能出现一次
//定义一个没有参数也没有返回值的函数
void myfun1()
{
printf("hello world\n");
printf("nihao beijing\n");
printf("welcome to 1000phone\n");
return ;
}
//定义一个有参数的函数
void myfun2(int a, int b)
{
int sum;
sum = a + b;
printf("%d + %d = %d\n", a, b, sum);
}
//定义一个有返回值的函数
int myfun3(int a, int b)
{
int sum;
sum = a + b;
return sum;
}
四、函数的声明
1、概念对已经定义的函数,进行说明函数的声明可以声明多次。2、为什么要声明有些情况下,如果不对函数进行声明,编译器在编译的时候,可能不认识这个函数,因为编译器在编译c程序的时候,从上往下编译的。3、声明的方法什么时候需要声明主调函数和被调函数在同一个.c文件中的时候被调函数在上,主调函数在下
void fun(void)
{
printf("hello world\n");
}
int main()
{
fun();
}
被调函数在下,主调函数在上
int main()
{
fun();
}
void fun(void)
{
printf("hello world\n");
}
(1)直接声明法(常用)将被调用的函数的第一行拷贝过去,后面加分号
#include <stdio.h>
//函数的声明:一般当子函数在主函数的下方时,需要在主函数的上方进行声明
void myfun1();
void myfun2(int a, int b);
int myfun3(int a, int b);
int main(int argc, char *argv[])
{
myfun1();
return 0;
}
void myfun1()
{
printf("hello world\n");
printf("nihao beijing\n");
printf("welcome to 1000phone\n");
return ;
}
void myfun2(int a, int b)
{
int sum;
sum = a + b;
printf("%d + %d = %d\n", a, b, sum);
}
int myfun3(int a, int b)
{
int sum;33 sum = a + b;
return sum;
}
(2) 间接声明法将函数的声明放在头文件中,.c程序包含头文件即可
a.c
#include”a.h”
int main()
{
fun();
}
void fun(void)
{
printf("hello world\n");
}
a.h
extern void fun(void);
主调函数和被调函数不在同一个.c文件中的时候 一定要声明声明的方法:直接声明法将被调用的函数的第一行拷贝过去,后面加分号,前面加extern间接声明法(常用)将函数的声明放在头文件中,.c程序包含头文件即可
myfun.c
#include "myfun.h" //此时包含的头文件要使用双引号,在当前目录下去找对应头文件
void myfun1()
{
printf("hello world\n");
printf("nihao beijing\n");
printf("welcome to 1000phone\n");
return;
}
myfun.h
#ifndef MYFUN_H
#define MYFUN_H
//函数的声明
void myfun1();
#endif // MYFUN_H
main.c
#include <stdio.h>
#include "myfun.h"
int main(int argc, char *argv[])
{
myfun1();
return 0;
}
五、函数的调用
函数的调用方法变量= 函数名(实参列表);//带返回值的函数名(实参列表);//不带返回值的
#include <stdio.h>
void myfun1();
void myfun2(int a, int b);
int myfun3(int a, int b);
int main(int argc, char *argv[])
{
//函数的调用
//没有参数也没有返回值
//直接写函数名,并且要在后面加括号
myfun1();
printf("**********************\n");14
//有参数,没有返回值
//需要在函数名右边括号中传入参数,参数可以是常量表达式,也可以是变量表达式
myfun2(100, 90);
int x = 10, y = 20;
//x、y:实参,实际参数,本质就是在函数调用的时候将实参的值传递给形参
myfun2(x, y);
printf("**********************\n");
//有参数也有返回值
//可以使用一个变量接收函数执行结果(返回值),或者直接输出也可以
int n;
n = myfun3(100, 90);
printf("n = %d\n", n);
printf("sum = %d\n", myfun3(90, 66));
return 0;
}
void myfun1()
{
printf("hello world\n");
printf("nihao hello\n");
printf("welcome to hello\n");
return ;
}
//a、b:形参,形式参数,主要用于保存实参传递的值,本质跟实参没有任何关系,只是值传递
void myfun2(int a, int b)
{
int sum;
sum = a + b;
printf("%d + %d = %d\n", a, b, sum);
}
int myfun3(int a, int b)
{
int sum;
sum = a + b;
return sum;
}
在定义函数时,确定函数的参数和返回值应根据函数的具体功能来决定。在编写函数时,最初的重点应该放在函数的逻辑和功能上,而不是过早地考虑参数传递和返回值。当在编写代码时需要使用某些值,但当前函数中不存在这些值时,才需要考虑如何传递参数。这样的思维过程可以确保参数传递的合理性。
一旦函数编写完成,再考虑是否需要将某些结果返回给其他函数使用,这时需要考虑返回值的设计。使用函数的好处包括:一次定义,多次调用,减少代码的冗余度;提高代码的模块化程度,便于调试和阅读。
通过合理设计和使用函数,可以使代码更具可维护性和可读性,同时提高代码的重用性和整体质量。