目录
-
- 什么是函数?
- C语言中函数的分类
-
- 库函数
- 自定义函数
-
- 写一个函数可以在两个整数中找到最大值。
- 交换整形变量函数
- 函数的参数
-
- 实际参数(实际参数)
- 形式参数(形式参数)
- 函数的调用
-
- 传值调用
- 传址调用
- 每文一语
什么是函数?
函数的概念在数学中很常见。但是你知道C语言中的函数吗?
Γ ( z ) = ∫ 0 ∞ t z ? 1 e ? t d t ? . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞tz?1e?tdt.
子程序(英语:Subroutine, procedure, function, routine, method,subprogram, callable unit),代码的一部分是一个大程序, 由一个或多个句块组成。与其他一代相比,它负责完成特定的任务 代码,相对独立。一般有输入参数和返回值,以隐藏过程的包装和细节。这些代码通常集成到软件库中。
C语言中函数的分类
库函数
- 我们知道,当我们学习C语言编程时,我们总是迫不及待地想在编写代码后知道结果,并想在我们的屏幕上打印结果。此时,我们将经常使用一个功能:按照一定格式将信息打印到屏幕上(printf)。
- 在编程过程中,我们经常复制字符串(strcpy)。
- 我们也计算编程,总是计算nk次方这样的操作(pow)。 就像我们上面描述的基本功能一样,它们不是商业代码。在开发过程中,每个程序员都可以使用它。为了支持可移植性,提高程序效率,C语言基础库提供了一系列类似的库函数,方便程序员进行软件开发。
那么如何学习这些库函数呢?以下是一个网站:
http://www.cplusplus.com/reference/
有些朋友看到这些英语很大,所以还有其他网站很容易理解吗?答案是肯定的,这里推荐一个这样的网站:
https://zh.cppreference.co/w/%E9%A6%96%E9%A1%B5
里面包括C语言和c++的一些语法查询和函数的查询与使用,非常适合程序员作为日常的知识回忆!
所有的库函数都会集成在头文件里面,所以在使用库函数的时候需要引用头文件,不然会有问题,就像我们的Python里面的第三方库一样,在C语言里面也是类似的道理,只是C语言的库函数没有Python的第三方库那样强大和丰富。
// 函数定义。
// 定义一个名为“ sum ”并拥有函数体“ { return x+y; } ”的函数
int sum(int x, int y)
{
return x + y;
}
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "你好,王小王-123";
char str2[20] = {
0};
printf("str2里面的东西是:%s\n",str2);
strcpy(str2,str1);
printf("str2里面的东西是:%s\n", str2);
return 0;
}
strcpy(str1,str2)是将str2里面的东西复制到str1里面去,相对于是一个复制操作!
再看一个memset这个函数
自定义函数
如果库函数能干所有的事情,那还要程序员干什么?所有更加重要的是自定义函数。
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
ret_type fun_name(para1, * )
{
statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1 函数参数
写一个函数可以找出两个整数中的最大值。
#include <stdio.h>
//get_max函数的设计
int get_max(int x, int y)
{
return (x > y) ? (x) : (y);
}
int main()
{
int num1 = 10;
int num2 = 20;
int max = get_max(num1, num2);
printf("max = %d\n", max);
return 0;
}
这里有用到一个三目操作符,当第一个条件满足后,就会返回其后面的值,如果不满足则返回最后一个值。
交换整型变量的函数
#include <stdio.h>
//实现成函数,但是不能完成任务
void Swap1(int x, int y)
{
int tmp = 0;
tmp = x;
x = y;
y = tmp;
}
可能大多是的同学都会写出这样的代码,但是遗憾的是错误的函数,因为它并不能完成我的需求!
下面我们看看正确的代码:
//正确的版本
void Swap2(int *px, int *py)
{
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int num1 = 1;
int num2 = 2;
Swap1(num1, num2);
printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
Swap2(&num1, &num2);
printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
return 0;
}
为什么会出问题?没有交换整型变量,我们观察代码发现了,一个传入的是指针,一个是传入的整型变量。
这是因为在C语言中,我们的所有变量都是按照地址进行存储的,所以说在第一个函数里面其实是我们的变量重新开辟了新的地址空间,所以在函数的里面进行交换,最终是没有影响到我们的实际的变量值的,所以说这个代码是有问题的!
所以第二个将变量的地址,传入函数,它是互通的,有一种联系,这也是C语言的魅力之一!
这也是我们需要注意的,在考试的时候,经常会被设置为考点!
那么什么情况下需要传入地址?就是通过函数内部的功能语法把外面的变量改变,所以就需要传入地址!
函数的参数
实际参数(实参)
真实传给函数的参数,叫实参。
实参可以是:
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形 参。
形式参数(形参)
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效上面 Swap1 和 Swap2 函数中的参数 x,y,px,py 都是形式参数。在main函数中传给 Swap1 的 num1 ,num2 和传给 Swap2 函数的 &num1 , &num2 是实际参数。
函数的调用
传值调用
函数的形参和实参分别占有不同内存块,,除非是传入地址!
传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
每文一语
如果你不知道如何努力;那么此时你应该学会如何躺平!