栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言函数(1)】

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言函数(1)】

距上一次整理知识点,已经过去了差不多两周
今天,比较系统的C语言知识点,它又来了!✨

文章目录
  • 一、函数是什么
  • 二、C语言中函数的分类
    • 1、库函数
    • 2、自定义函数
  • 三、函数的参数
    • 1、实际参数(实参)
    • 2、形式参数(形参)
  • 四、函数的调用
    • 1、传值调用
    • 2、传址调用
  • 五、函数的嵌套调用和链式访问
    • 1、嵌套调用
    • 2、链式访问
  • 六、总结

一、函数是什么

我们知道,数学中有各种各样的函数,那么,你了解C语言中的函数吗?

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



其实,一个完整的程序就像一个大工厂,它由各种各样的函数组成,这些函数就像一个个小的车间,也可以称之为“子程序”!

二、C语言中函数的分类

C语言中函数大致分为两类

1、库函数

为什么会有库函数呢?

  1. 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想
    把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格
    式打印到屏幕上(printf)。
  2. 在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。
  3. 在编程是我们也计算,总是会计算n的k次方这样的运算(pow)。

像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。
那么我们应该怎么学习库函数呢

下面给大家提供一个网站,任何库函数都可以在里面找到!
www.cplusplus.com

里面对每一个函数都有非常详细的解释,快去学习吧!!!
C语言中经常用到的函数有
IO函数
字符串操作函数
字符操作函数
内存操作函数
时间/日期函数
数学函数
其他库函数

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

2、自定义函数

我们知道,程序员这个职业之所以存在,就是因为有很多程序仅仅依靠库函数是无法实现的,所以我们往往要根据需求自己来定义有相应功能的函数。

自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。

函数的组成:

下面来举个例子,写一个函数可以找出两个数中的最大值

#define _CRT_SECURE_NO_WARNINGS
#include 
int Max(int x, int y)
{
	return (x > y) ? x : y;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int max = Max(a, b);
	return 0;
}


再举个例子,写一个函数交换两个数的值:

#define _CRT_SECURE_NO_WARNINGS
#include 
void swap(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:a=%d b=%dn", a, b);
	swap(a, b);
	printf("交换后:a=%d b=%dn", a, b);
	return 0;
}

但是,这样的代码真的是正确的吗???
下面来看一下运行截图:

可以看到,输入的两个值并没有进行交换
所以上面的方法是错误的,大家可千万不要完美地记住了错误的方法啊
下面来看正确的方法:

#define _CRT_SECURE_NO_WARNINGS
#include 
void swap(int* x, int* y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:a=%d b=%dn", a, b);
	swap(&a, &b);
	printf("交换后:a=%d b=%dn", a, b);
	return 0;
}

运行结果:

这样就顺利的完成了两个数的交换!
那么上面两个代码到底有什么区别呢
在下面的函数的参数和函数的调用中,我们来进行解答!

三、函数的参数 1、实际参数(实参)


2、形式参数(形参)

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


这里需要注意的是,形参只是实参的一份临时拷贝,改变形参并不影响实参的值!!!

这也是为什么上面的第一个代码达不到交换效果的原因
下面做更深一步的解释:

这里可以看到 Swap1 函数在调用的时候, x , y 拥有自己的空间,同时拥有了和实参一模一样的内容。
所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝

四、函数的调用 1、传值调用

2、传址调用


下面用一个比较通俗易懂的方法解释一下:

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

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。


运行效果:

其实,上面的代码可以解释为----我们可以在主函数中调用各种函数,同样也可以在其他函数中调用函数。
函数可以嵌套调用,但是不能嵌套定义。

2、链式访问

把一个函数的返回值作为另外一个函数的参数。

#define _CRT_SECURE_NO_WARNINGS
#include 
int Max(int x, int y)
{
	return (x > y) ? x : y;
}
int Add(int x, int y)
{
	return x + y;
}
int main()
{
	int a = 1;
	int b = 2;
	int c = 5;
	int ret = Max(Add(a, b), c);
	printf("ret=%dn", ret);
	return 0;
}

运行效果:

六、总结

前两周真的是因为很忙,所以函数知识点的整理就往后推了推,这只是函数的第一章,剩余的内容我将会在第二章中写完,还请小伙伴们支持!

在这一章中,比较重要的就是函数的传值和传址调用之间的区别。我还是建议大家最好用传址调用,因为这样不用再为形参开辟一个和实参一样的空间。当实参所占空间较大时,它的作用就更加显著了!

好了,今天的分享就到这里了,希望大家一起进步!下次再见!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/834988.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号