news 2026/7/30 4:39:21

嵌入式学习9

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式学习9

C语言学习笔记:二维字符数组 + 函数全解(避坑总结)

一、今日学习内容总览

今天重点学习两大模块:二维字符型数组(字符串数组存储多行文本)、C语言函数完整体系(定义/调用/声明、变量作用域、存储类型、值传递),配套Linux gcc编译运行环境,整理开发规范与高频踩坑点。

二、二维字符型数组

1. 核心作用

一维字符数组仅存储单个字符串;二维字符数组可存放多个字符串,用于多行文本、单词列表、菜单等场景。

2. 定义格式

char数组名[行数][列数];
  • 行数:最多存储字符串数量;
  • 列数:单个字符串最大长度,必须预留\0结束符空间

示例:

// 最多5个字符串,单串最大31字符+1位\0charstr[5][32];

3. 元素访问规则

  1. str[i][j]:访问第i个字符串第j个单个字符,类型char
  2. str[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. 核心重点

  1. 每行是独立一维字符数组,每行末尾自动补\0
  2. 列数必须常量,行数可省略,编译器自动根据字符串数量推导;
  3. 内存逐行连续存储,包含所有字符与结束符;
  4. 字符串库函数直接接收str[i]作为参数。

6. 注意点 & 易踩坑

  1. 列数不足,无\0%s打印乱码、内存越界;
  2. 禁止整体赋值:str[0] = "test";编译报错,改用strcpy(str[0], "test");
  3. scanf("%s", str[i])遇空格截断,带空格文本用fgets
  4. 下标越界读写数组,篡改其他变量内存;
  5. 局部数组未初始化,元素为随机垃圾值,建议定义时={0}清空。

三、C语言函数完整知识点

1. 函数核心价值

  1. 消除重复代码,代码复用;
  2. 模块化拆分逻辑,降低维护难度;
  3. 单一函数只实现单一功能,解耦业务逻辑。

2. 函数三要素:定义、调用、声明

(1)函数定义(完整实现)

语法:

返回值类型 函数名(形参类型1形参1,形参类型2形参2,...){函数逻辑;return返回值;}

规则:

  1. 函数名命名规则同变量;
  2. 无返回值必须写void,省略返回值默认int
  3. return返回值与函数类型不一致时,自动强制转换;
  4. void函数可写return;提前终止,无需返回数据。

示例:闰年判断函数

intisLeapYear(intyear){if((year%4==0&&year%100!=0)||(year%400==0))return1;return0;}
(2)函数调用

语法:函数名(实参1, 实参2);

  1. 实参可为常量、变量、表达式;
  2. 实参与形参个数、顺序一一对应,类型不匹配自动隐式转换;
  3. 函数调用是表达式,拥有返回值,可赋值、打印、逻辑判断。

调用示例:

intflag=isLeapYear(2000);printf("是否闰年:%d\n",flag);
(3)函数声明

作用:告知编译器函数签名,解决「函数定义在调用下方」编译报错。
格式(去掉函数体,保留头部):

intisLeapYear(intyear);

使用规则:

  • 函数写在main上方:无需声明;
  • 函数写在main下方:文件头部提前声明;
  • 多文件开发:声明统一放入.h头文件。

3. 变量作用域 & 生命周期

(1)作用域(可访问范围)
  1. 局部变量:定义在{}内部,仅当前大括号可用;
  2. 全局变量:所有函数外部定义,整个.c文件任意位置访问。
(2)生命周期(内存存在时长)
  1. auto局部变量:进入作用域分配栈空间,出{}立刻回收;
  2. static静态变量、全局变量:程序编译分配静态区,程序结束才释放。

4. 四大存储类型

语法:存储类型 数据类型 变量名;

关键字存储区域初始化特性特性说明
auto(默认)栈区未初始化=随机值局部变量默认类型,出括号销毁
registerCPU寄存器随机值加速访问,无空闲寄存器则退化为auto
extern静态区仅声明,不可赋值调用其他文件全局变量/函数
static数据段静态区未初始化自动置01.局部static:仅本函数可见,只初始化一次
2.全局static:仅当前文件可见,避免多文件重名
程序内存分区
  1. 文本区:存放程序代码、指令;
  2. 数据区:全局/static变量、字符串常量;
  3. 堆区:程序员手动malloc/free管理;
  4. 栈区:auto局部变量、函数调用栈帧;
  5. 寄存器:register变量临时存储。

5. 值传递(C语言默认传参方式)

  1. 实参仅拷贝数值给形参,形参是独立内存副本;
  2. 函数内修改形参,完全不影响外部原始实参;
  3. 如需修改外部变量,后续学习指针传递实现。

6. 函数核心重点

  1. 必须先声明/定义,后调用;
  2. 有返回值函数每条逻辑分支建议配置return
  3. static局部变量仅初始化一次,多次调用保留上次结果;
  4. static修饰全局变量/函数,限制作用域为本文件,解决多文件命名冲突。

7. 函数高频踩坑点

  1. 自定义函数写在main下方,缺少函数声明,编译警告/报错;
  2. 混淆值传递特性,试图修改外部实参无效果;
  3. auto局部变量未初始化直接参与运算,结果随机错乱;
  4. static局部变量误以为每次调用都会重新初始化;
  5. 函数部分分支缺少return,返回随机垃圾值;
  6. 无限制滥用全局变量,代码耦合度高,BUG难以定位;
  7. 函数形参漏写数据类型,语法报错。

四、整体开发避坑汇总

二维字符数组坑

  1. 列数未预留\0,字符串打印乱码、内存越界;
  2. 直接对字符串数组行整体赋值,编译报错;
  3. 数组下标越界读写,破坏其他变量内存;
  4. scanf("%s")读取带空格字符串,自动截断内容。

函数开发坑

  1. 缺少函数声明;
  2. 值传递无法修改外部变量;
  3. 局部变量未初始化直接运算;
  4. static变量初始化逻辑理解错误;
  5. 函数分支缺少return;
  6. 全局变量滥用耦合代码。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/30 4:39:12

FPGA原理图设计:从门电路到模60计数器的硬件实现

1. 项目概述:从原理图到数字逻辑的直观构建 在FPGA开发的入门阶段,很多朋友会直接从Verilog HDL代码开始,这当然是一条主流且强大的路径。但有时候,尤其是在教学演示或者理解底层数字电路结构时,回归最原始的“原理图输…

作者头像 李华
网站建设 2026/7/30 4:38:30

VMware虚拟机软件官方下载、安装与激活全流程详解

1. 项目概述:为什么我们需要一个“干净”的虚拟机环境?作为一名在IT运维和开发领域摸爬滚打了十多年的老手,我处理过无数台物理机和虚拟机。今天想聊的这个话题,看似基础,但恰恰是很多新手朋友,甚至是一些有…

作者头像 李华
网站建设 2026/7/30 4:37:59

三菱PLC仿真:GX Works2通过MX OPC Server连接组态王全攻略

1. 项目概述:打通工业数据流的“最后一公里” 在工业自动化项目的前期开发、调试和后期维护中,我们经常会遇到一个核心痛点:如何让不同品牌、不同协议的设备与上位机软件(如SCADA、MES)进行高效、可靠的数据交换&#…

作者头像 李华
网站建设 2026/7/30 4:33:11

Windows Server 2012 iSCSI存储配置实战:从协议原理到生产部署

1. 项目背景与iSCSI协议核心价值在数据中心和中小型企业的IT基础设施里,存储一直是个既基础又核心的议题。你可能遇到过这样的场景:一台应用服务器(比如跑着SQL Server的Windows Server)的本地磁盘空间告急,或者你需要…

作者头像 李华
网站建设 2026/7/30 4:31:21

HarmonyOS应用开发实战:猫猫大作战-startByType 通过类型启动

前言 startByType 通过指定文件类型启动其他应用来处理该文件。在「猫猫大作战」中,使用 startByType 打开图片分享到社交应用。 一、startByType 基础 import { common } from kit.AbilityKit;async function shareImage(context: common.UIAbilityContext, fil…

作者头像 李华
网站建设 2026/7/30 4:28:33

Claude Code与Kimi K3推理栈:AI开发工具对比与实战指南

今天我们来深入分析两个备受关注的开源项目:Claude Code 和 Kimi K3 推理栈。这两个项目在 AI 开发领域引起了广泛讨论,特别是关于代码生成能力和推理效率的优化。 Claude Code 是 Anthropic 推出的代码生成工具,专注于提升开发者的编程效率…

作者头像 李华