C:函数
函数
调用函数的本质是CPU跳转到函数定义的部分,执行完成后再返回原来的位置继续往下执行

函数使用三步骤:
-
函数声明
- 函数声明是对定义的函数的返回值类型说明,以通知系统在本函数中所调用的函数是什么类型
- 函数声明之后才能进行函数调用,否则编译器会报错
- 函数声明是一个说明语句,必须以分号结束
int add(); //函数声明就是普通变量名后加个括号 int add(int x,char ch); int add(int ,char );//形参名可以省略,形参类型不能省略 /*函数声明时需要在括号里面声明一下参数类型,参数可以为空,但需要和实现时保持一致*/ -
函数定义:函数的实现
- 函数的定义是一个完整的函数单元,包含函数类型、函数名、形参及形参类型、函数体等。
- 在程序中,函数的定义只能有一次。
- 函数首部与花括号间不加分号。
- 函数定义本身也有声明的功能,只要函数定义在函数调用之前,就不需要再单独声明函数
#include<stdio.h> int main(){ int a = 0; /*函数声明,由于函数实现在main函数下面,所以要先声明才能使用add函数 如果把add函数实现写在main函数之前就不需要再单独声明了*/ int add(int x); int b = add(); //函数执行结果就是返回值,返回值可以被接收赋值给其他变量 return 0; } int add(int x){ //函数类型就是返回值val的数据类型 int val = x++; return val; } -
函数调用
- 函数执行结果就是返回值,返回值可以被接收赋值给其他变量
- 如果函数没有使用
return关键字指定返回值,则函数的返回值时随机数,或者编译器直接报错 void类型的函数可以没有返回值
#include<stdio.h> void add(char *ch) { *ch = 'A'; } int main(){ char x; add(&x); printf("%c", x); //输出结果为A return 0; }
函数间数据传递的方式
- 参数:调用函数可以使用参数向被调用函数传递数据
- 返回值:被调用函数通过返回值向调用函数传递数据
递归函数
C语言中函数可以调用自己,函数中调用自身的函数叫做递归函数
递归函数的两个要素:
- 递推规则
- 递推结束条件
- 如果没有递推结束条件,程序就会进入死循环
递推函数的应用:
- 文件系统遍历
- 数据结构的操作
- 数学计算
- 图形渲染
- 前端开发
/*汉诺塔问题*/
#include<stdio.h>
// 数量 起始柱 中转柱 目的柱
void Hanoi(int n, char pos1, char pos2, char pos3)
{
if (n > 1)
{
Hanoi(n - 1, pos1, pos3, pos2);
printf("%c->%c ", pos1, pos3);
Hanoi(n - 1, pos2, pos1, pos3);
}
else
{
printf("%c->%c ", pos1, pos3);
}
}
int main()
{
int n = 0;
scanf("%d", &n);
Hanoi(n,'A', 'B', 'C');
return 0;
}
作用域和生命周期
- 作用域:变量在程序中定义后所能被访问的范围
- 生命周期:变量在程序中存在的时间
- 局部变量:定义在函数内部的变量
- 全局变量:定义在函数外部的变量
| 变量 | 作用域 | 生命周期 |
|---|---|---|
| 局部变量 | 从定义语句开始到函数结束前 | 从定义语句分配内存到函数结束释放内存 |
| 全局变量 | 从定义语句开始到程序结束前 | 从定义语句分配内存到程序结束释放内存 |
| 块级变量 | 从定义语句开始到语句块结束前 | 从定义语句分配内存到语句块结束释放内存 |
静态变量
- 声明静态变量时需要使用
static关键字 - 静态变量的生命周期是整个程序执行时间
- 静态变量初始化只在程序开始时执行依次,不论初始化语句写在什么位置
- 未初始化的静态变量自动被初始化为0
- 静态局部变量的作用域仍在所属函数内
- 静态全局变量的作用域只包含声明它的文件里的所有语句,不可以跨文件使用静态全局变量
随机数
srand(time(0))的意思是:用当前时间来设定rand函数所用的随机数产生演算法的种子值。- 其中,
time(time_t *t); 是 C 标准库函数,如果t是空指针,直接返回当前时间。如果t不是空指针,返回当前时间的同时,将返回值赋予t指向的内存空间。 srand (unsigned seed)函数中参数unsigned seed表示随机数产生器的初始值(种子值)。srand设置产生一系列伪随机数发生器的起始点,要想把发生器重新初始化,可用1作seed值。任何其他值都把发生器匿成一个随机的起始点。rand检索生成的伪随机数。
rand函数是用来生成随机数的,它的随机数范围为0~RAND_MAXRAND_MAX的取值取决于编译器的实现,C语言中RAND_MAX = 32767。
#include<stdio.h>
#include<time.h>
int main(){
srand(time(0)); //随机数种子
rand(); //产生的随机数
rand() % 100; //通过取余得到100范围内的随机数
return 0;
}

浙公网安备 33010602011771号