电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
获取菜单数组大小的办法?你知道吗?
分 享
扫描二维码分享
获取菜单数组大小的办法?你知道吗?
二维数组
sizeof
结构体
耳根的耳根
关注
发布时间: 2020-08-17
丨
阅读: 425
我们在定义菜单的时候,常见的总会碰到一堆下拉列表,比如下拉串口波特率,我们一般是这么定义的: ```c typedef struct //下拉列表项目定义 { const char *Item; //项目名称 }LIST_ITEM; ``` ```c //通讯波特率选择菜单 LIST_ITEM const COMM_BPS_List[] = { "600", "1200", "2400", "4800", "9600", "19200", }; ``` 我们定义初始的波特率选择菜单的时候,数组COMM_BPS_List总是不会定义为固定大小的,因此当我们需要增加下拉列表选项的时候,直接在菜单数组中增加定义就好了,比如增加串口波特率 "38400","57600","115200",我们可以直接加在数组的后面,而不必修改数组大小的定义。 ```c //通讯波特率选择菜单 LIST_ITEM const COMM_BPS_List[] = { "600", "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200", }; ``` 那么我们在菜单显示的时候,需要遍历这个菜单数组COMM_BPS_List,把里面定义的选项都进行显示,那么我们该如何遍历这个数组呢? 按照菜单数组每个元素大小遍历貌似是个不错的办法,如果我们定义数组的时候,把数组定义为固定的长度,数组中每组元素的长度也是固定的,那么遍历是很好解决的。可是这样会有两个不好的后果: 1.不可以随意添加数组的元素 2.数组元素的的内容往往不是统一长度的,统一长度,只能是占用更多的空间,把多余的空间用空格填充 当我们系统越庞大的时候,采用这样的定义,修改一次菜单,意味着占用更多的空间,进行更多的全局修改,就会带来更多的代码风险。所以采用这种办法是不可取的。 因此我们继续回到上面的问题,如何统计一个可变数组的元素个数呢?我们是这么做的,如下所示,很简单的一段代码: ```c #define ITEM_NUM(List) (sizeof(List) / sizeof(List[0])) ``` 好多朋友看到这条语句的时候都会疑问,sizeof这个函数,不就是计算出数组元素所占用的空间大小的吗? 为了方便计算,我们重新定义一个小型的波特率菜单: ```c //通讯波特率选择菜单 LIST_ITEM const COMM_BPS_List[] = { "600", "1200", "19200", }; ``` 1.sizeof(COMM_BPS_List)的计算结果是什么呢? 2.sizeof(COMM_BPS_List[0])的计算结果是什么呢? 3.sizeof(COMM_BPS_List[1])的计算结果是什么呢? 4.sizeof(COMM_BPS_List[2])的计算结果是什么呢? 这个计算结果会让很多c语言基础不扎实的人大吃一惊。在这里我们留一个悬念,再来几个数组的定义。 ```c char const COMM_BPS_List1[]={"600"}; char const COMM_BPS_List2[]={"1200"}; char const COMM_BPS_List3[]={"19200"}; ``` 5.sizeof(COMM_BPS_List1)的计算结果是什么呢? 6.sizeof(COMM_BPS_List2)的计算结果是什么呢? 7.sizeof(COMM_BPS_List3)的计算结果是什么呢? 好了现在宣布计算结果(用STM32F103计算得到的结果): **1.sizeof(COMM_BPS_List)的计算结果是12 2.sizeof(COMM_BPS_List[0])的计算结果是4 3.sizeof(COMM_BPS_List[1])的计算结果是4 4.sizeof(COMM_BPS_List[2])的计算结果是4 5.sizeof(COMM_BPS_List1)的计算结果是4 6.sizeof(COMM_BPS_List2)的计算结果是5 7.sizeof(COMM_BPS_List3)的计算结果是6** 计算结果是不是让大家大吃一惊呢,下面就做个解释吧。 上面的结果本质上是两种数组的大小,指针类型和非指针类型字符数组的大小。 ------------ 字符类型字符串数组的大小是死的,就是看见的字符个数+1,定义数组的时候,强制把数组的最好一位赋值给0.因此,数组COMM_BPS_List1[]共有四个元素,分别如下所示: ```c COMM_BPS_List1[0] = ‘6’; COMM_BPS_List1[1] = ‘0’; COMM_BPS_List1[2] = ‘0’; COMM_BPS_List1[3] = 0; ``` ------------ 而字符型指针数组的大小也是死的,指针的大小是固定的,在单片机中是4个字节,所以有下面的结果: ```c sizeof(COMM_BPS_List)=12; sizeof(COMM_BPS_List[0])=4; sizeof(COMM_BPS_List[1])=4; sizeof(COMM_BPS_List[2])=4; ``` 而不是单纯的看他定义的内容的大小。 ------------ 因此我们在遍历数组个数的时候,因此可以用下面的函数 ```c #define ITEM_NUM(List) (sizeof(List) / sizeof(List[0])) ``` 如下指针数组COMM_BPS_List中菜单个数,就可以用ITEM_NUM(COMM_BPS_List)得到了。 ```c LIST_ITEM const COMM_BPS_List[] = { "600", "1200", "2400", "4800", "9600", "19200", "38400", "57600", "115200", }; ``` 关于菜单的定义?菜单个数的判断?指针数组的大小?这些你学会了吗?
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
耳根的耳根
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交