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语言中函数可以调用自己,函数中调用自身的函数叫做递归函数

递归函数的两个要素:

  1. 递推规则
  2. 递推结束条件
    • 如果没有递推结束条件,程序就会进入死循环

递推函数的应用:

  • 文件系统遍历
  • 数据结构的操作
  • 数学计算
  • 图形渲染
  • 前端开发
/*汉诺塔问题*/
#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设置产生一系列伪随机数发生器的起始点,要想把发生器重新初始化,可用1seed值。任何其他值都把发生器匿成一个随机的起始点。rand检索生成的伪随机数。
  • rand函数是用来生成随机数的,它的随机数范围为0~RAND_MAX
  • RAND_MAX的取值取决于编译器的实现,C语言中RAND_MAX = 32767
#include<stdio.h>
#include<time.h>
int main(){
	srand(time(0));	//随机数种子
	rand();			//产生的随机数
	rand() % 100;	//通过取余得到100范围内的随机数
    return 0;
}
posted @ 2024-12-06 13:18  -O-n-e-  阅读(36)  评论(0)    收藏  举报