0
点赞
收藏
分享

微信扫一扫

让vue项目支持glsl语法

云上笔记 2023-07-27 阅读 74

C语言中的函数(超详细)

【前言】

一、函数概述

我们都知道函数是数学里的重要组成部分,数学中我们常见到函数的概念,但是你了解C语言中的函数吗?
其实函数就相当于一个子程序,那什么是子程序呢?

二、C语言中函数的分类

1.库函数

1.1什么是库函数?

1.2库函数是C语言提供的吗?

1.3为什么会有库函数呢?

1.4那怎么学习库函数呢?

这里我给大家推荐一个可以很好查到有关库函数的网站链接:可查到库函数资料

简单的总结,C语言常用的库函数都有:

注!!!
库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。

2.自定义函数

如果库函数能干所有的事情,那还要程序员干什么?
所有更加重要的是自定义函数!!!
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
所谓自定义就是这些都是我们自己来设计。这给我们自己一个很大的发挥空间!!!

函数的组成:
我们举一个例子:写一个函数可以找出两个整数中的最大值。

#include <stdio.h>
//get_max函数的设计
int get_max(int x, int y)
{
	return (x > y) ? (x) : (y);//三目运算符:x大于y返回x,x小于y返回y
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int max = get_max(num1, num2);
	printf("max = %d\n", max);
	return 0}

这里我们输入a=10 b=20结果是
在这里插入图片描述
正确的,说明我们自己定义的函数还是比较成功的哈👏
上面可以看到,我们定义的一个函数get_max()是为了得到一个最大值,而get max也能理解为这个意思,由此可以看出咱们在定义函数的时候取的名字尽量要有意义,不然别人读你的代码根本不知道你这写的什么函数,你要知道,我们写代码是要给别人看的,你总不能写个乱七八糟的函数,让你写东你写个西在上面,你让别人怎么看呀,是不是。所以还是要考虑别人的感受!!!
扯远了哈,咱们继续

三、函数的参数

1.实际参数(实参)

  • 真实传给函数的参数,叫实参。
  • 实参可以是:常量、变量、表达式、函数等。
  • 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

2.形式参数(形参)

比如上面中的get_max(int x, int y),其中xy就是形式参数。
我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。

四、函数的调用

1.传值调用

2.传址调用

举个例子:交换两个数的值

void Swap2(int*p1, int*p2)
{
	int tmp = 0;
	tmp = *p1;//tmp = a;
	*p1 = *p2;//a = b;
	*p2 = tmp;//b = tmp;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:a = %d b = %d\n", a, b);
	Swap2(&a, &b);
	printf("交换后:a = %d b= %d\n", a, b);
	return 0;
}

这里我们输入a=10 b=20
在这里插入图片描述
说明我们定义的函数是对的,但是我们看上面Swap(&a,&b)中使用的是取地址a和取地址b,这是为什么呢?为什么不用Swap(a,b)呢?

因为我们需要的是交换a、b的值,仅仅使用传值调用的话只能改变实参的表面数值,而实参内部没有被传到形参,当形参执行函数时只带上了实参的数值,而形参内部还是形参本身,那么虽然输出的结果是符合要求的,但是内部功能可能会有差异。所以我们采用传址调用,这样我们把a、b的地址传到形参里面,形参就能根据地址输出我们想要的效果。这么说,你该懂了吧!那么能否奉上阁下的一件三连呢!不要辜负我的一番苦心啊!!!

五、函数的嵌套调用和链式访问

1.嵌套调用

void x()
{
	
}
void y()
{
	x();
}
int main()
{
	y();
}

我只是举个例子来表示嵌套调用,你们可不要这么写哈。
注意!!!
函数可以嵌套调用,但是不能嵌套定义。

2.链式访问

六、函数的声明和定义

1.函数声明

例:

int get_max(int x, int y);//<font color = green>函数声明
int main()
{
	get_max(a,b);
}

加在最上面或者get_max(a,b)上面都可以。

2. 函数定义

例:

int get_max(int x, int y)
{
	return (x > y) ? (x) : (y);//三目运算符:x大于y返回x,x小于y返回y
}

这就是函数定义。

学习了函数声明和函数定义以后,我们是不是就知道怎么使用函数了,好,那我们就来写一道题:写一个函数,完成2个整数的相加
这里我们可以创建一个函数Add(),它要完成两个数相加,那么函数就可已定义为:

int Add(int x, int y)
{
	return x + y;
}

函数声明为:

int Add(int x, int y);

那么我们就可以开始写这个程序,代码就是

#include<stdio.h>
int Add(int x, int y)
{
	return x + y;
}
int Add(int x, int y);
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = Add(a, b);
	printf("%d\n", ret);
	return 0;
}

输入a=10 b=20
运行结果:
在这里插入图片描述
到这里你是不是觉得没什么问题,确实没什么问题哈。
但事实上,在工程里面是这样用的吗?
如果你只是写一个文件的话,这样写是没有任何问题的。
但是我们未来在工程中,代码是比较多的,如果还是用我们上面这种方法的话,那可就太繁琐了,所以,我们的函数一般是放在.h文件中声明,在.c文件中实现的!

下面我给大家来演示一遍(VS2019)

  1. 新建一个头文件add.h
    在这里插入图片描述
    因为头文件是进行函数的声明,所以在头文件中输入函数声明

在这里插入图片描述

  1. 新建两个源文件add.c和test.c
    在这里插入图片描述
    add.c里面用来定义我们的函数

在这里插入图片描述

test.c是我们自己输入跑程序要用的代码

在这里插入图片描述
程序跑起来就是这个样子
在这里插入图片描述

七、函数递归

今天超级详细的C语言中的函数就分享到这里啦!希望各位多多点赞收藏评论!!你的支持是我最大的动力!!!

举报

相关推荐

0 条评论