学嵌入式和C语言编程|学习日记Day11:各类数组作函数参数、变量作用域、生命周期、存储类别

发布时间:2026/8/2 5:23:26
学嵌入式和C语言编程|学习日记Day11:各类数组作函数参数、变量作用域、生命周期、存储类别 前言今天继续拓展函数传参学习一维字符数组、二维整型数组、二维字符数组作为函数参数的规则然后学习变量的作用域、生命周期还有auto、static、register、extern四种存储类型。在嵌入式开发当中局部、全局、static 静态变量使用频率非常高直接关系到外设状态保存、多文件工程开发是嵌入式 C 的核心重点。一、不同数组作为函数参数1. 一维字符型数组做函数参数函数定义格式c返回值 函数名(char 数组名[]){//函数体}调用格式c函数名(数组名);注意要点一维字符数组传参只传递数组名即可不需要传入长度字符串末尾自带\0结束标记函数内部依靠\0判断字符串结束。本质传递依旧是数组首元素地址函数内部修改数组内容外部原始数组会跟着改变。⚠️在被调函数内部执行sizeof(数组形参)得到的是地址所占内存大小不是数组真实总字节。2. 二维整型数组做函数参数函数定义格式c返回值 函数名(int 数组名[][列数], int 行数){//函数体}调用格式c函数名(数组名, 行数);注意要点二维整型数组传参形参列数必须写明行数可以省略。函数内部无法通过sizeof自动计算行数行数需要当做实参手动传入列数可以在函数内通过sizeof(a[0]) / sizeof(a[0][0])计算得到。3. 二维字符型数组做函数参数函数定义格式c返回值 函数名(char 数组名[][列数], int 行数){//函数体}调用格式c函数名(数组名, 行数);各类数组传参汇总表数组类型函数形参写法是否需要传入长度传递本质一维 int 数组int arr[] , int len✅必须传入数组长度首元素地址一维 char 数组char str[]❌不需要依靠\0结束符首元素地址二维 int 数组int arr[][列] , int row✅传入行数列数代码内计算数组首行地址二维 char 数组char str[][列] , int row✅传入行数数组首行地址二、变量的作用域空间角度作用域标识符、变量能够被访问、使用的代码范围。局部作用域写在大括号{}内部函数内部定义的变量、形参只能够在大括号内部访问。全局作用域写在所有函数外面整个工程都可以访问例如函数名、全局变量。嵌套作用域规则如果内外出现同名标识符外层变量在内层不可见就近原则。语法强制要求变量必须先定义后使用同一个作用域不能定义名字相同的变量。三、变量的生命周期时间角度生命周期变量内存开辟直到内存被回收的完整存活时间。动态生命周期局部变量。走到变量定义处开辟内存离开作用域内存立刻回收。静态生命周期和整个程序运行时间保持一致。程序启动开辟内存程序结束才释放内存。全局变量、static 静态变量属于静态生命周期。局部变量、全局变量、static 静态变量对比变量类型作用域生命周期存储位置未初始化默认值局部普通变量仅限当前大括号内部动态生命周期出作用域销毁栈区随机垃圾值全局变量整个程序全局可见静态生命周期程序结束销毁数据段 /.bss 段系统默认 0static 局部静态变量仅限局部大括号内部静态生命周期程序结束销毁数据段 /.bss 段系统默认 0补充未初始化的全局变量、static 静态变量存放在.bss段系统自动清零已经初始化完成的全局、static 静态变量存放在.data段。四、四种存储类型修饰符完整格式存储类型 数据类型 变量名;1. auto默认存储类型日常写局部变量默认就是 auto一般省略不写。具备局部变量动态生命周期存储在栈区。2. static 静态修饰符static 有三层作用修饰局部变量变量变成静态生命周期依旧保留局部作用域出大括号不会销毁值会保留。修饰函数该函数只允许当前.c 源文件内部调用别的源文件无法访问。修饰全局变量该全局变量仅限当前源文件内部使用外部其他.c文件无法访问。嵌入式常用场景按键计数、状态标记用 static 局部变量保存上一次状态函数多次调用之间保留数值。3. register 寄存器变量只是给编译器建议尽量把该变量放到 CPU 寄存器中提升运行速度不是强制命令。寄存器没有内存地址不能对 register 变量取地址。4. extern 外部声明修饰全局变量声明外部别的.c文件定义的全局变量允许本文件访问外部全局变量。修饰函数声明外部其他.c文件中的函数本文件可以调用外部函数。今日学习总结一维字符数组传参不用传长度依靠字符串结束符\0二维数组传参列数绝对不能省略。作用域看空间生命周期看时间局部变量栈区分配出大括号销毁全局、static 静态变量程序全程存在。static 修饰局部变量作用域不变生命周期改为静态函数多次调用之间保留数值。static 修饰函数、全局变量限制作用域为本.c文件extern 用来引用别的文件的全局变量和函数是多文件嵌入式工程必备语法。register 只是建议放寄存器不能取地址auto 是局部变量默认属性通常省略。