【C语言】函数的深度解析(1)

🌹作者:云小逸
📝个人主页


前言

——————————————————————————————

1.函数是什么?

函数我们可能会想的是数学中的函数,但这里我们要说的是计算机语言中的函数!

维基百科中对函数的定义:【子程序】

在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method,
subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组
成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。
一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

百度百科中对函数的定义是:子程序、(OOP中)方法。

函数是指一段可以直接被另一段程序或代码引用的程序或代码。也叫做子程序、(OOP中)方法。
一个较大的程序一般应分为若干个程序块,每一个模块用来实现一个特定的功能。
所有的高级语言中都有子程序这个概念,用子程序实现模块的功能。
在C语言中,子程序是由一个主函数和若干个函数构成的。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。

2.C语言中函数的分类:

a.库函数

(1)出现的原因:

为什么会有库函数? 那是因为在写程序中会有一些功能几乎所有程序员都会用到,
比如printf函数,scanf函数等一些函数,
为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

(2)常见的库函数

在这里插入图片描述

(3)库函数的分类

IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数

(4)举例:strcpy,memset

a.strcpy

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main(void)
{
	char arr1[20] = { 0 };
	char arr2[] = "abc";
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

在这里插入图片描述

b.memset

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main(void)
{
	char arr1[] = "hello bit!";
	memset(arr1, 'x', 5);
	printf("%s", arr1);
	return 0;
}

在这里插入图片描述
注:
但是库函数必须知道的一个秘密就是:使用库函数,必须包含 #include 对应的头文件。

(4)库函数的结构:函数名,返回值类型和函数参数。

b.自定义函数

(1)出现的原因:

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

(2)自定义函数的结构:函数名,返回值类型和函数参数。

在这里插入图片描述

(3)举例:get_max、swap函数:

a.求两个函数的最大值:get_max函数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int get_max(int x, int y)
{
	return  (x > y ? x : y);	
}
int main(void)
{
	int a = 3;
	int b = 5;
	int max = 0;
	max = get_max(a, b);
	printf("%d", max);
	return 0;
}

在这里插入图片描述

在这里插入图片描述

b.交换函数:swap函数
(1)错误写法:传递数值
void swap1(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}

在这里插入图片描述

错误原因:

在这里插入图片描述
当函数调用的时候,实参传给形参,形参其实是实参的一份临时拷贝所以对形参的修改,不会影响实参

(2)正确做法:传递地址
void swap2(int* px, int* py)
{
	int temp = *px;
	*px = *py;
	*py = temp;
}

在这里插入图片描述

完整代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void swap1(int x, int y)
{
	int temp = x;
	x = y;
	y = temp;
}
void swap2(int* px, int* py)
{
	int temp = *px;
	*px = *py;
	*py = temp;
}
int main(void)
{
	int a = 3;
	int b = 5;
	printf("交换前:a=%d,b=%d\n", a, b);
	//swap1(a, b);
	swap2(&a, &b);
	printf("交换后:a=%d,b=%d", a, b);
	return 0;
}

3.函数的参数:

a.实际参数:

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

get_max(3,5)//传递常量
get_max(a,b)//传递变量
get_max(3+5)//传递表达式
get_max(3,getmax(1,2))//传递函数

b.形式参数:

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元)
所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效
在这里插入图片描述

4.函数的调用:

a.传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
例如:swap1

b.传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
例如:swap2

最后

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1、不讲苦劳,只讲功劳。没有结果,过程再辛苦,也不必强调。

2、自己不优秀,认识谁都没有用,自己有钱有能力了,自然而然就会有很多的人,以及很多的机会找上门来。

3、特别低调,穿衣打扮比较随意,并不会各种奢侈品,朋友圈也很简单,基本不会炫富,不会说自己有钱,也不会晒豪车豪宅什么的。

4、即使已经很有钱了,也并不会就此止步,很有野心,也很有欲望,一心想要变得更加有钱,能够拥有更多。

5、很多时候,话都不会太多,比起总是各种说,只会更加倾向于倾听,善于观察身边的人,也善于从别人的口中去提取一些有用的东西。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

  • 48
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 100
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

云小逸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值