【C语言】函数详解

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️小林爱敲代码
      🛰️专栏:✈️C语言快速入门
      🛰️欢迎关注:👍点赞🙌收藏✍️留言
在这里插入图片描述

      这篇文章给大家介绍C语言中函数的使用,本来打算昨天为大家更新的。但是阳了,早上刚挂完点滴,就跑来更新博客了。🌺🌺

  
      每日一句: 成功不是将来才有的,而是从决定去做的那一刻起,持续积累而成。

大纲:

![

函数内容的大纲:
在这里插入图片描述

💖7 函数

函数有2类,一类是库函数,一类是自定义函数,库函数就是C语言为我们提供的。例如我们常用的 printf(),scanf(),这些都是C语言为我们提供的库函数。自定义函数则是我们自己定义的函数,自己定义,自己调用。

💪7.2 函数的声明和定义

🔮7.2.1 函数的声明

函数的声明定义格式为: 返回值类型 函数名(参数列表);
返回值类型:就是数据类型,如果没有返回值类型则用void。
函数名:随意,但在C语言中,函数名不能重复。
参数列表:就是传给函数的数据。

以下是函数声明的例子:

#include <stdio.h>

//一个无返回值,无参数的函数声明
void a();

//一个无返回值,有1个int参数的函数声明
void b(int a);

//有1个int类型参数和1个double类型参数 ,且有返回值为int类型的函数
int c(int a,double d);

int main()
{
	return 0;
}

函数的声明一般会放在.h的头文件中。

🔮7.2.2 函数的定义

函数声明之后,我们需要定义。定义的话就直接把声明函数展开。
函数的定义格式为: 返回值类型 函数名(参数列表) { 函数体;}

函数定义如下:

#include <stdio.h>

//一个无返回值,无参数的函数声明
void a();

//一个无返回值,有1个int参数的函数声明
void b(int a);

//有1个int类型参数和1个double类型参数 ,且有返回值为int类型的函数
int c(int a,double d);

//函数a的定义
void a()
{
	printf("a");
}

//函数b的定义
void b(int a)
{
	printf("b");
}

//函数c的定义
int c(int a, double d)
{
	printf("c");
	//有返回值必须返回一个值
	return 0;
}

int main()
{
	return 0;
}

当然,函数在定义的时候,如果未声明,会自动声明。
所以也可以这样:

#include <stdio.h>

//函数a的定义,前面未声明在此处自动声明
void a()
{
	printf("a");
}

//函数b的定义,前面未声明在此处自动声明
void b(int a)
{
	printf("b");
}

//函数c的定义,前面未声明在此处自动声明
int c(int a, double d)
{
	printf("c");
	//有返回值必须返回一个值
	return 0;
}

int main()
{
	return 0;
}

那么问题来了,既然定义时候会自动声明,那为什么还要声明呢?这是因为文件扫描是从上往下的,如果发现调用了一个函数,可函数在下面实现。那么就无法识别到这个函数。
例如:

#include <stdio.h>

//函数a的定义
void a()
{
	printf("a");
}

int main()
{
	
	a();//调用函数a

	return 0;
}

这个代码因为定义在main函数的前面,所以可以调用。但是如果定义在main函数的下面,那么main函数调用a函数时,无法识别到a,就会出错。

#include <stdio.h>

int main()
{
	
	a();//调用函数a

	return 0;
}

//函数a的定义
void a()
{
	printf("a");
}

在这里插入图片描述
所以这时候加上声明,就可以正常运行了。
在这里插入图片描述

💪7.3 函数的调用和传参

🔮7.3.1 函数的调用

函数的调用很简单,上面就有演示。
函数的调用格式: 函数名(参数列表);
参数列表要和函数定义时的参数列表匹配
函数调用的例子:

#include <stdio.h>

//函数 a没有参数
void a()
{
	printf("a");
}
//函数 b有1个int参数
void b(int b)
{
	printf("b");
}

int main()
{
	
	a();//函数名(参数列表); 但是函数a没有参数,所以不用传参
	b(1); //函数名(int); 因为函数定义时有1个int类型参数,所以必须传1个int类型
	return 0;
}

🔮7.3.2 函数的传参

函数的传参上面调用b时也演示过了,就是根据函数定义(声明)时的参数列表一一对应传参。所以再为大家提供几个传参例子。

#include <stdio.h>

//参数列表 (int)
void b(int b)
{
	printf("b");
}

//参数列表 (int,double,char)
void c(int a,double b , char c)
{
	printf("b");
}


int main()
{
	b(1);//传参列表(int)
	c(1,1.1,'a'); //传参列表(int,double,char); 
	return 0;
}

不过需要注意的是, 传参给函数的参数叫实参。而函数接收的参数叫形参,形参是实参的临时拷贝,改变形参不会影响实参的值。

#include <stdio.h>

//参数列表 (int)
void b(int c)
{
	c = 5;
}

int main()
{
	int c = 2;
	b(c);//传参列表(int)
	printf("%d ", c);
	return 0;
}

如图,C的值并没有发生改变
在这里插入图片描述

💪7.4 函数的返回值

当你期待一个函数会返回你一个特定的值时,你可以选择带返回值的函数。如果没有返回值,那么返回值的类型就是void。

假设我要实现一个Add函数,用来求2个数的和。

#include <stdio.h>

//返回值的数据类型为int
int Add(int x, int y)
{
	int z = x + y;
	return z;
}

int main()
{
	int z = Add(3, 5); //用 z 来接收函数的返回值
	printf("%d ", z);
	return 0;
}

在这里插入图片描述

💪7.5 函数的传址调用

如果我们期望改变实参的值,我们可以选择传址调用,传址调用就是传指针给函数。然后函数对指针指向的空间进行操作。

#include <stdio.h>
void Swap(int* a,int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("%d,%d\n", a, b);
	Swap(&a, &b);//传a和b的地址进去
	printf("%d,%d\n", a, b);

	return 0;
}

我们会发现a 和 b 的值发生了变化。因为我们给函数传的是 a 和 b的地址,而函数内部通过对a 和 b 解引用找到 a和b所在的内存空间。从而让它们进行交换。
在这里插入图片描述

💪7.6 函数的嵌套调用

函数的嵌套调用,就是我们在另外一个函数调用其他函数。

#include <stdio.h>

void b()
{
	printf("b\n");
}

void a()
{
	printf("a\n");
	b(); //a函数里面调用 b函数
}

int main()
{
	a();//main函数里面调用函数a
	return 0;
}

在这里插入图片描述
所以,函数也是可以嵌套调用的。

💪7.7 函数的递归

递归,栈溢出的罪魁祸首!什么是递归呢?简单来说,就是函数自己调用自己本身。比如以下代码,main函数一直调用自己。如果没有递归的终止条件的话,那么就会出现栈溢出。

#include <stdio.h>

int main()
{
	main();
	return 0;
}

在这里插入图片描述

所以在使用递归时,我们需要注意两点,一点是递归的结束条件,还有一点就是这个条件每递归一次都要发生变化。

比如我想实现一个函数,要求把一串数字倒着输出。

#include <stdio.h>

void a(int n)
{
	//当n=0时,递归终止
	if (n == 0)
	{
		return;
	}
	printf("%d ", n % 10);
	//自己调用自己
	a(n / 10);
}

int main()
{
	int n = 12345;
	a(n);
	return 0;
}

在这里插入图片描述

以上程序的递归展开图:
在这里插入图片描述

结言🥳:

💦💦如果有写的不好或者错误的地方,希望大家指证出来,我会不断的改正自己的错误。💯💯如果感觉写的还可以,可以点赞三连一波哦~🍸🍸后续会持续为大家更新大纲上的内容,以及数据结构,C++,Linux操作系统等方面的知识,本人会坚持持续更新。

🌺🌺拖着发烧的身体也要更新!你们的支持是我最大的动力,希望在往后的日子里,我们大家一起进步!!!
🌺🌺

  • 44
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 58
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林 子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值