目录
从0开始记录我的学习历程,我会尽我所能,写出最最大白话的文章,希望能够帮到你,谢谢。
提示:文章作者为初学者,有问题请评论指正,感谢。
函数的概念
函数是 c 语言的功能单位,实现一个功能可以封装一个函数来实现。
定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。
/*你可以理解成C语言中的函数就像是一个小助手。当你想要完成一个任务时,你告诉这个助手需要什么(参数),助手就会根据你给的东西去做事情,然后告诉你结果(返回值)。这样,你就不用每次都亲自去做同样的事情,只需要让助手帮你做就行了。简单来说,函数就是帮你完成特定任务的代码块。*/
函数的分类
1.从定义角度分类(即函数是谁实现的)
-
库函数: 就像是超市里现成的食品,库函数是C语言标准库或其他库中已经写好的函数。你不需要自己从头开始做,只要知道怎么用就行了。比如
printf()
函数,它就是一个库函数,你可以用它来在屏幕上显示文字,而不需要知道它内部是怎么实现的。 -
自定义函数: 这就像是你自己在家做饭。自定义函数是你根据需要自己写的函数。你决定它做什么,需要哪些材料(参数),以及最后会产出什么(返回值)。自定义函数让你能够根据自己的需求创建功能,使得代码更加有组织,也方便重复使用。
-
系统调用: 系统调用有点像是叫外卖。当你需要操作系统层面的一些功能,比如读写文件,你会使用系统调用。这些函数直接与操作系统交互,执行一些底层操作。系统调用通常比库函数更接近硬件,处理的是更为基础和核心的任务。
反正你可以这么理解,库函数是别人写好你可以直接用的;自定义函数是你根据自己的需求写的;系统调用是让你能够利用操作系统提供的功能。
2.从参数角度分类
1.有参函数:
- 有参函数就像是一个厨师,他需要一些食材来做菜。这些食材就是函数的参数。参数可以是一个,也可以是多个,具体取决于函数的功能。
- 例如,你可以有一个函数
int max(int x, int y)
,它接受两个整数作为参数,然后找出其中较大的那个数。这就像是你告诉厨师:“我有两个苹果,你帮我找出最大的那个苹果。”
2.无参函数
- 无参函数就像是一个魔术师,他不需要任何道具,只凭空变出了一只兔子。这些函数没有参数,它们自己内部完成了一些操作。
- 例如,你可以有一个函数
void greet()
,它不需要任何输入,只是打印出一句问候语。这就像是魔术师不需要任何道具,就能变出一只兔子。
3.从返回值角度分类
-
带返回值的函数:
- 这就像是你请了一个厨师,他会做一道菜并把它送到你手里。这个菜就是函数的返回值。
- 例如,你可以有一个函数
int add(int x, int y)
,它接受两个数字(x
和y
),然后把它们相加,最后返回结果。这就像是厨师告诉你:“我会把这两个食材加在一起,你等着拿到结果吧!” - 在这个例子中,返回值类型是
int
,表示这个函数会返回一个整数。 - 注意:函数有形参,可以是一个,或者多个,参数的类型随便 完全取决于函数的功能
-
没有返回值的函数:
- 这就像是你请了一个服务员,他会帮你做一些事情,但不会给你任何东西。你只是想让他完成一项任务。
- 例如,你可以有一个函数 int fun(void),它不需要任何输入,只是打印出问候语。这就像是服务员告诉你:“好的,我会给你打印出问候语,但不会给你其他东西。”
- 在这个例子中,返回值类型是
void
,表示这个函数不会返回任何东西。 - 注意:函数没有参数,在形参列表的位置写个 void 或什么都不写
函数的定义
函数的定义:简单来说,就是告诉计算机这个函数要做什么,以及如何做。函数的定义包括几个部分:返回值类型、函数名、形式参数列表(简称形参列表)和函数体。
- 返回值类型:这告诉编译器函数执行完毕后会返回什么类型的数据。如果函数不需要返回任何值,那么这个类型就是
void
。 - 函数名:这是函数的唯一标识,用于在其他地方调用这个函数。
- 形式参数列表:这里列出了传递给函数的变量,我们称之为参数。每个参数都需要指定一个类型,因为C语言是静态类型的语言,这意味着每个变量的类型必须在编译时就确定。
- 函数体:这是花括号
{}
中的部分,包含了实现函数功能的所有代码。
#include <stdio.h >
int add(int a, int b) {
return a + b;
}
int main() {
int c = add(2, 3);
printf("%d",c);
return 0;
}
这里,int
是返回值类型,表示这个函数会返回一个整数。add
是函数名,int a, int b
是形式参数列表,表示这个函数需要两个整数作为输入。最后,花括号中的 return a + b;
是函数体,最后在主函数中调用add,它描述了这个函数的具体操作,即返回这两个整数的和。
函数的声明
函数声明的概念
函数声明,也叫做函数原型,其实就是告诉编译器:嘿,这里有一个函数,它长这样,但具体做什么,我稍后再告诉你。函数声明包括函数的返回类型、函数名和参数类型,但不包括函数体。它像是一个承诺,告诉编译器将会有一个这样的函数可以使用。注:函数的声明可以声明多次。
为什么要进行函数声明
为什么要这么做呢?因为在C语言中,如果你想在一个函数中调用另一个函数,编译器需要提前知道那个函数的存在和它的细节。如果你没有提前声明,当编译器遇到那个函数的调用时,它会一头雾水,不知道你在说什么,然后就会报错。所以,函数声明就像是给编译器的一个小提示,让它知道有这么一个函数,即使它的具体内容还没写出来。
声明的方法
1.什么时候需要声明
1.1被调函数在上,主调函数在下 例:
有无形参时函数的调用方法
-
void fun(void) { printf( "hello world\n"); } int main() { fun(); }
这种情况下不需要声明
-
下面是主调函数和被调函数在同一个.c文件的情况。
-
1.2 被调函数在下,主调函数在上 例:
-
#include <stdio.h > void fun(void);//这里声明 int main() { fun();} void fun(void) { printf("hello world\n");}
编译器从上往下编译,在 main 函数(主调函数),不认识 fun ,需要声明
-
那我们该咋个声明呢,有直接声明法和间接声明法两种方法。
-
当主调函数和被调函数在同一个.c 文件中时
-
直接申明法就是将被调用的函数的第一行拷贝过去,后面加分号就可以了。
-
void fun(void); //这里声明的哦 int main() { fun(); } void fun(void) { printf( "hello world\n"); }
间接申明法
-
将函数的声明放在头文件中,.c 程序包含头文件即可
-
.c文件代码
-
#include<stdio.h> #include"a.h"// 包含头文件,使得fun函数的声明对这个文件可见 int main() { fun(); // 调用fun函数 return 0; } void fun(void) { printf("hello world\n"); }
.h文件代码 这个是头文件 下面有图
-
extern void fun(void);
-
主调函数和被调函数不在同一个.c 文件中 的时候 一定要声明
声明的方法:
直接声明法
将被调用的函数的第一行拷贝过去,后面加分号,前面加 extern。
-
间接声明法
将函数的声明放在头文件中,.c 程序包含头文件即可(结合上面看喽,敲一下就知道咋回事了)。
-
函数的调用
-
有无返回值时函数的调用方法
-
有返回值的函数
- 当一个函数有返回值时,这意味着它会在执行完毕后给出一个结果。
- 你可以把这个结果存储在一个变量中,或者直接用在表达式里。
- 例如,如果有一个返回整数的
add
函数,你可以这样调用它:int sum = add(5, 3); // 将返回值存储在sum变量中
- 或者直接使用它的返回值:
printf("The sum is %d\n", add(5, 3)); // 直接打印返回值
-
无返回值的函数
- 如果一个函数没有返回值(即返回类型为
void
),它就不会给出任何结果。 - 这种函数通常是执行一些操作,比如打印信息,但不需要返回数据。
- 调用无返回值的函数很简单,直接写函数名和参数(如果有的话)就可以了:
printMessage(); // 调用一个不返回任何值的函数
- 如果一个函数没有返回值(即返回类型为
-
有形参的函数
- 当一个函数有形参时,你需要在调用函数时提供相应的实际参数(实参)。
- 实参的数量和类型必须与函数声明中的形参相匹配。
- 例如,如果
add
函数需要两个整数作为参数,你就需要这样调用它:int result = add(10, 20); // 传递两个整数作为参数
-
无形参的函数
- 如果一个函数没有形参,那么在调用时你不需要提供任何参数。
- 这种函数在调用时后面的括号是空的,但括号仍然是必须的。
- 例如,一个简单的打印函数可能看起来像这样:
sayHello(); // 调用一个不需要任何参数的函数
总结
以上就是今天要讲的内容,本文仅仅简单介绍了C语言中的函数的分类声明以及调用,祝愿你我的朋友在学习的路上一帆风顺,也祝愿我会成为一个优秀的嵌入式工程师。