函数
优点:
- 降低代码耦合度
- 降低代码冗余度
- 提高代码复用率
- 提高代码可读性
思想:
封装【包装】
声明:
语法:
extern 函数名(形参列表); // 注意: 此时 形参列表中变量名可以忽略不写;
定义:
语法:
返回值类型 函数名(形参列表) { 函数体; } 返回值类型 : 返回值的数据类型 如果没有返回值 写 void (NULL) 函数名: 是标识符 自定义 形参列表: 声明或者定义的多个变量 使用逗号 隔开 可有可无 函数体: 封装的代码 return : 结束当前函数。 return 后跟值或者变量 : 结束当前函数并返回该值或变量,此时这个值或变量就是返回值。 一个函数只能有一个返回值。 定义位置:函数外 注意: c语言中同一个程序中不能出现两个或两个以上函数名相同的函数
调用:
语法:
通用 函数名 (实参列表); 调用有返回值的: 变量名 = 函数名(实参列表); 注意: 实参列表要与形参列表一致(长度一致,顺序一致,数据类型一致) 调用位置:函数中
定义与调用的关系
先定义再调用,
定义只需要一次 但是可以调用无数次。
可以调用被人或系统定义好的函数
分类
系统调用:
可以直接操作内核的函数库函数:
由系统提供的函数称为库函数,printf () 、 scanf() 、 rand() …
自定义函数:
自己定义的函数。
分步学习
思路:
当不知道需要什么参数时 先写void 写逻辑的时候 要是 参数不能自己提供 就去写形参 接收
> 1 自定义无参无返回值的函数并调用 举例: 定义一个函数计算5的阶乘 // 定义: void jiecheng() { int num = 1; //这里可以自己提供 for(int i =1 ; i < 6; i++){ num *= i; } printf("%d5的阶乘为\n",num); } //调用: jiecheng(); > 2 自定义有参无返 void func(int x) { for(int i = 1; i < x+1; i++) num *= i; } printf("%d的阶乘为%d\n",x,num); } > 3 自定义无参有返回 // 定义一个函数 生成一个大写字母 char toUpper() { int x = rand()%26+65; char y = (char)x; return y; } char zimu = toUpper(); cout<< zimu <<endl; > 4 自定义有参有返回 void jecheng() { int num =1 ; for(int i = 1;i <= x; i++) { num *= i; } return num; }
特殊情况:
多重调用:
- 函数A中调用函数B 函数B调用函数c …
递归:
- 函数本身调用本身,称为递归
这样的写法就称为 递归 但是缺点是会引起 死循环
可以避免:【可以给增加限制条件 来限制能调用自己的情况出现】
多文件编程
gcc 要编译的所有的源文件名 -o 生成的可执行文件名
注意:
- 多个源文件之间使用空格隔开
- 无需编译头文件
头文件:
- 对应的源文件的声明文件
- 头文件名与源文件名一致,以.h结尾
- 头文件中可以书写c语言代码
#include <stdio.h> #include "hello.h"
" " 表示现在当前目录下寻找,如果没有再去系统路径下寻找
<>:直接去系统路径下寻找
变量存储
内存的分区
相关知识
进程:可执行文件从运行到结束整个动态的过程就叫进程。(占内存空间)
在32位平台每一个进程占4G空间(虚拟空间) 从0 x 00 00 00 00 至 0 x ff ff ff ff
局部变量
定义位置: 函数中
定义语法: 数据类型 变量名;
默认值: 随机数
存储区域: 栈中
作用域:局部变量所定义的代码块中可用,同一个作用域下变量名不能相同
生命周期:随着所在函数的调用而生成,随着所在函数执行结束而销毁
全局变量
定义位置: 函数外
定义语法: 数据类型 变量名;
默认值: 0
存储区域: 全局区
作用域:当前程序中
生命周期:随着程序启动而生成,随着所在程序销毁而释放
静态局部变量
定义位置:函数中
定义的语法:static 数据类型 变量名 = 值;
默认值: 0
static int x; // 初始值 不再是 使用auto修饰的随机数 而是0
作用范围:只在语句中有效
生命周期: 随着所在函数的第一次调用而启用,随着程序结束而销毁
内存区域:全局区
静态全局变量
定义位置:函数外
语法:static 数据类型 变量名;
默认值:0
存储区域:全局区
作用域:当前文件中 只能在当前文件使用
生命周期:随着所在程序的启动而生成,随着所在程序的执行完毕而销毁
const修饰的变量
特点: 使用const修改后的变量 , 只能赋值一次,并称为常量 【通常使用大写】
语法:
const 数据类型 变量名 = 值;
后面再使用此变量不能再赋值了
全局函数与静态函数
全局函数:
普通的函数
可以在当前程序中任何一处使用
语法:
static 返回值类型 函数名(形参列表) { 函数体; }
静态函数
使用 static 修饰的全局函数
限制: 只能在当前文件中使用
语法:
static 返回值类型 函数名(形参列表) { 函数体; }
全局函数与静态函数
全局函数:
普通的函数
可以在当前程序中任何一处使用
语法:
static 返回值类型 函数名(形参列表) { 函数体; }
静态函数
使用 static 修饰的全局函数
限制: 只能在当前文件中使用
语法:static 返回值类型 函数名(形参列表) { 函数体; }