目录
函数是什么?
C语言中函数的分类:
库函数:
一般常见的库函数我们可以分为以下几类:
自定义函数:
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
以下是它的组成:
#include <stdio.h>
int get_max(int x, int y)
{
if (x >= y)
{
return x;
}
else
{
return y;
}
}
int main()
{
int a = 5;
int b = 20;
int max = get_max(a, b);
printf("max = %d\n", max);
return 0;
}
函数的参数
1. 实际参数(实参)
2. 形式参数(形参)
实际参数(实参)
形式参数(形参)
函数的调用
1. 传值调用
传值调用

传址调用
void Swap(int* x, int* y)
{
int t = 0;
t = *x;//相当于把x的值赋给了t
*x = *y;//相当于把y的值赋给了x
*y = t;//相当于把t的值赋给了y
}
#include<stdio.h>
int main()
{
int a = 0, b = 0;
scanf("%d %d", &a, &b);
Swap(&a, &b);
printf("%d %d", a, b);
return 0;
}
这里我们刚开始学习的时候可能会直接把a,传到函数中。但是我们会发现结果并没有交换。这就要用到我们的传址交换了。
以下是重点:
我们刚才说过,形参是实参的拷贝。试想一下,别人从你的电脑拷贝了一个文件在他的电脑上,别人更改文件内容会改掉你文件的内容吗?显然是不会的。这就相当于传值调用。
传址调用则是我直接把a和b的地址给函数,函数通过寻找其地址后,在进入其中更改内容,是不是就可以改掉了呢?
总结一下:如果要更改实参内容,就要传地址,否则就传实参的值。
函数的嵌套调用和链式访问
嵌套调用:
#include <stdio.h>
void new_line()
{
printf("haha\n");
}
void three_line()
{
int i = 0;
for (i = 0; i < 3; i++)
{
new_line();//这里这个函数调用了另一个函数
}
}
int main()
{
three_line();
return 0;
}
链式访问
#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
这里这段代码打印的是 4321
这里我们要了解到printf函数的返回值是打印在屏幕上字符的个数
现在我们应该就知道为什么是4321
首先:从外到内访问时,第一个printf的值还在第二个printf的返回值当中,第二个printf的值在第三个printf的返回值当中,第三个printf打印43,其返回值为2(字符个数为2);第二个printf打印2,其返回值为1(字符个数为1),第一个printf打印1.
函数的声明和定义
函数的声明
//这一段代码要放到一个头文件,比如Add.h的文件中
//函数的声明
int Add(int x, int y);
//这段代码放到一个源文件中,直接引用刚才的头文件就行
#include "Add.h"
int Add(int x, int y)
{
return x+y;
}
函数的定义
函数递归
void Print(int x)
{
if (x > 9)//这里就是限制条件
{
Print(x/10);//这里就是越来越接近限制条件
}
printf("%d ", x % 10);
}
int main()
{
int n = 0;
scanf("%d", &n);
Print(n);
return 0;
}
可能如果只看代码,很多人都是看不懂的。这时候,我们就可以画图来帮助我们理解递归。(如果一碰到不会的递归,我们都可以画出递归图,一部分也是可以的,只要你理解了)
希望这篇文章可以帮到你。有什么不对的地方也希望大家提出来我们讨论一下。