【C语言】函数详解-创新互联

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

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

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

桃山网站制作公司哪家好,找创新互联公司!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联公司于2013年开始到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联公司

大纲:

![

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

目录
  • 💖7 函数
    • 💪7.2 函数的声明和定义
      • 🔮7.2.1 函数的声明
      • 🔮7.2.2 函数的定义
    • 💪7.3 函数的调用和传参
      • 🔮7.3.1 函数的调用
      • 🔮7.3.2 函数的传参
    • 💪7.4 函数的返回值
    • 💪7.5 函数的传址调用
    • 💪7.6 函数的嵌套调用
    • 💪7.7 函数的递归
  • 结言🥳:

💖7 函数

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

💪7.2 函数的声明和定义 🔮7.2.1 函数的声明

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

以下是函数声明的例子:

#include//一个无返回值,无参数的函数声明
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//一个无返回值,无参数的函数声明
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//函数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//函数a的定义
void a()
{printf("a");
}

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

	return 0;
}

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

#includeint main()
{	a();//调用函数a

	return 0;
}

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

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

💪7.3 函数的调用和传参 🔮7.3.1 函数的调用

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

#include//函数 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//参数列表 (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//参数列表 (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//返回值的数据类型为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 函数的传址调用

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

#includevoid 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 函数的嵌套调用

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

#includevoid b()
{printf("b\n");
}

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

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

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

💪7.7 函数的递归

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

#includeint main()
{main();
	return 0;
}

在这里插入图片描述

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

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

#includevoid 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操作系统等方面的知识,本人会坚持持续更新。

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


网站栏目:【C语言】函数详解-创新互联
浏览路径:http://pwwzsj.com/article/despji.html