嵌入式学习9

发布时间:2026/7/30 4:39:50
嵌入式学习9 C语言学习笔记二维字符数组 函数全解避坑总结一、今日学习内容总览今天重点学习两大模块二维字符型数组字符串数组存储多行文本、C语言函数完整体系定义/调用/声明、变量作用域、存储类型、值传递配套Linux gcc编译运行环境整理开发规范与高频踩坑点。二、二维字符型数组1. 核心作用一维字符数组仅存储单个字符串二维字符数组可存放多个字符串用于多行文本、单词列表、菜单等场景。2. 定义格式char数组名[行数][列数];行数最多存储字符串数量列数单个字符串最大长度必须预留\0结束符空间。示例// 最多5个字符串单串最大31字符1位\0charstr[5][32];3. 元素访问规则str[i][j]访问第i个字符串第j个单个字符类型charstr[i]代表第i个完整字符串可直接传入printf、字符串操作函数。4. 五种标准初始化写法// 1. 逐字符初始化charstr[5][32]{{h,e,l,l,o,\0},{w,o,r,l,d,\0}};// 2. 内层大括号规范写法charstr[5][32]{{hello},{world}};// 3. 最简省略内层括号推荐charstr[5][32]{hello,world,how,are,you};// 4. 全部初始化为空串charstr[5][32]{0};// 5. 省略行数列数不可省略charstr[][32]{hello,world};5. 核心重点每行是独立一维字符数组每行末尾自动补\0列数必须常量行数可省略编译器自动根据字符串数量推导内存逐行连续存储包含所有字符与结束符字符串库函数直接接收str[i]作为参数。6. 注意点 易踩坑列数不足无\0%s打印乱码、内存越界禁止整体赋值str[0] test;编译报错改用strcpy(str[0], test);scanf(%s, str[i])遇空格截断带空格文本用fgets下标越界读写数组篡改其他变量内存局部数组未初始化元素为随机垃圾值建议定义时{0}清空。三、C语言函数完整知识点1. 函数核心价值消除重复代码代码复用模块化拆分逻辑降低维护难度单一函数只实现单一功能解耦业务逻辑。2. 函数三要素定义、调用、声明1函数定义完整实现语法返回值类型 函数名(形参类型1形参1,形参类型2形参2,...){函数逻辑;return返回值;}规则函数名命名规则同变量无返回值必须写void省略返回值默认intreturn返回值与函数类型不一致时自动强制转换void函数可写return;提前终止无需返回数据。示例闰年判断函数intisLeapYear(intyear){if((year%40year%100!0)||(year%4000))return1;return0;}2函数调用语法函数名(实参1, 实参2);实参可为常量、变量、表达式实参与形参个数、顺序一一对应类型不匹配自动隐式转换函数调用是表达式拥有返回值可赋值、打印、逻辑判断。调用示例intflagisLeapYear(2000);printf(是否闰年%d\n,flag);3函数声明作用告知编译器函数签名解决「函数定义在调用下方」编译报错。格式去掉函数体保留头部intisLeapYear(intyear);使用规则函数写在main上方无需声明函数写在main下方文件头部提前声明多文件开发声明统一放入.h头文件。3. 变量作用域 生命周期1作用域可访问范围局部变量定义在{}内部仅当前大括号可用全局变量所有函数外部定义整个.c文件任意位置访问。2生命周期内存存在时长auto局部变量进入作用域分配栈空间出{}立刻回收static静态变量、全局变量程序编译分配静态区程序结束才释放。4. 四大存储类型语法存储类型 数据类型 变量名;关键字存储区域初始化特性特性说明auto默认栈区未初始化随机值局部变量默认类型出括号销毁registerCPU寄存器随机值加速访问无空闲寄存器则退化为autoextern静态区仅声明不可赋值调用其他文件全局变量/函数static数据段静态区未初始化自动置01.局部static仅本函数可见只初始化一次2.全局static仅当前文件可见避免多文件重名程序内存分区文本区存放程序代码、指令数据区全局/static变量、字符串常量堆区程序员手动malloc/free管理栈区auto局部变量、函数调用栈帧寄存器register变量临时存储。5. 值传递C语言默认传参方式实参仅拷贝数值给形参形参是独立内存副本函数内修改形参完全不影响外部原始实参如需修改外部变量后续学习指针传递实现。6. 函数核心重点必须先声明/定义后调用有返回值函数每条逻辑分支建议配置returnstatic局部变量仅初始化一次多次调用保留上次结果static修饰全局变量/函数限制作用域为本文件解决多文件命名冲突。7. 函数高频踩坑点自定义函数写在main下方缺少函数声明编译警告/报错混淆值传递特性试图修改外部实参无效果auto局部变量未初始化直接参与运算结果随机错乱static局部变量误以为每次调用都会重新初始化函数部分分支缺少return返回随机垃圾值无限制滥用全局变量代码耦合度高BUG难以定位函数形参漏写数据类型语法报错。四、整体开发避坑汇总二维字符数组坑列数未预留\0字符串打印乱码、内存越界直接对字符串数组行整体赋值编译报错数组下标越界读写破坏其他变量内存scanf(%s)读取带空格字符串自动截断内容。函数开发坑缺少函数声明值传递无法修改外部变量局部变量未初始化直接运算static变量初始化逻辑理解错误函数分支缺少return全局变量滥用耦合代码。