- 函数是什么
- 库函数
- 自定义函数
- 函数参数
- 函数调用
- 函数的嵌套调用和链式访问
- 函数的声明和定义
- 函数递归
- 首先我们需要知道函数是什么:C语言中的函数和数学中的函数是不一样的,但是又有相同之处,C语言中的函数也是需要有头文件的引用,每一个函数都对应与它所有的函数”头文件“就比如最常见的
#include<stdio.h> (这就是头文件,记得要写,不然代码运行不了,会报错)
int main()
{
printf("hello bit\n");
return 0:
}
报错示范:
- C语言中函数的分类:
函数的分类 1.库函数 2.自定义函数
让我们来认识一下库函数(为什么要有库函数呢)
- 就比如咱们在编程时我们会频繁的做一些字符串的拷贝工作(strcpy)是我们也计算,总是会计算n的k次方这样的运算(pow)。
就是咱们都会经常用到,有库函数的存在简单点来说就是为了支持可移植性和提高程序的效率率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员 进行软件开发。
在这里我就要给大家说一下http://www.cplusplus.com/reference/
就比如咱们的 strcpy
char * strcpy ( char * destination, const char * source );
让我们去 cplusepluse 里学习一下
![](https://i-blog.csdnimg.cn/blog_migrate/0453de9398e4f4d050c69eb68efb0a36.jpeg)
- Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
- To avoid overflows, the size of the array pointed by destination shall be long enough to contain the same C string as source (including the terminating null character), and should not overlap in memory with source.
将源指向的C字符串复制到目标指向的数组中,包括终止空字符(并在该点停止)。为避免溢出,目标指向的数组大小应足够长,以包含与源相同的C字符串(包括终止空字符),并且在内存中不应与源重叠。
2.自定义函数
- 自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。
举个上课的例子:写一个函数可以找出两个整数中的最大值
#include <stdio.h>
//get_max函数的设计
int get_max(int x, int y)
{
// //if (x > y)
// // return x;
// //else
// // return 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;
}
细致讲解:
通俗易懂,来个赞👍不过分吧!
3.函数的参数
- 咳咳,这里给大家说一下实参和形参
实际参数(实参): | |
真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形 参。 | |
形式参数(形参): | |
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单 元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。 |
来一个例子:写一个函数可以交换两个整形变量的内容。
void Swap(int x, int y)
{
int z = 0;
z = x;
x = y;
y = z;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);//输入
printf("交换前:a=%d b=%d\n", a, b);
//传值调用
Swap(a, b);
//传地址,传址调用
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
是不是打眼一看,没什么问题,但是
交换后的x,y的地址已经变了,那么正确的代码要怎么写呢
void Swap(int* px, int* py)
{
int t = 0;
t = *px; //t = a;
*px = *py;//a=b;
*py = t; //b =t
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);//输入
printf("交换前:a=%d b=%d\n", a, b);
//传值调用
/*Swap(a, b);*/
//传地址,传址调用
Swap(&a, &b);
printf("交换后:a=%d b=%d\n", a, b);
return 0;
}
这里就不妨有问了,给你出这题的人问你为什么会这样,咱们总不能说,来电脑给我我给调试一下吧
我给你讲怎么说 :当函数调用的时候实参传给形参时,形参将是实参的一份临时拷贝所以对形参的修改是不影响实参的。
4.函数的嵌套调用和链式访问
- 函数可以嵌套调用,但是不能嵌套定义。
- 链式访问:把一个函数的返回值作为另外一个函数的参数。
5. 函数的声明和定义
函数声明:
1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。
2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
3. 函数的声明一般要放在头文件中的。
函数定义:
- 函数的定义是指函数的具体实现,交待函数的功能实现。
6.函数的递归
下一篇细讲,记得点赞关注哦! (太多啦,需要多花一些时间)