[其它应用] C语言 获取数组长度且类型通用宏函数程序设计

[复制链接]
4972|10
 楼主| laocuo1142 发表于 2024-4-17 09:23 | 显示全部楼层 |阅读模式
之前章节介绍了用于计算类型或变量字节大小的sizeof()运算符,及用来表示数组大小的无符号整数类型size_t,这一节将使用这两个工具来设计一个可以用于获取各种C语言基础类型数组的长度,即数组中元素个数的函数。除了字符数组,字符串字符个数的统计方法,可参考上一章节中的内容。

获取非字符数组长度的宏函数设计
#define usual_arrlen(arr) sizeof(arr) / sizeof(arr[0])
宏函数的设计逻辑
首先,之所以将其定义为一个宏函数,主要是为了适用于不同类型的数组,如果是将其定义为普通的函数,则一般需要再声明函数参数的时候,声明数组的类型,这样函数传参的话就会受到数组类型的约束,因此不适用于大多数的数组类型;

其次,使用sizeof(arr) 获取数组占用的内存空间大小,然后使用sizeof(arr[0])来获取单个数组元素占用的内容空间大小,然后二者相除,即可计算数组元素的个数了;arr[0]中的索引也可以是其它的值,但应该要注意数组访问越界的问题,即索引值不能大于等于数组的长度。

arr[0]中的索引也可以是其它的值,但应该要注意数组访问越界的问题,即索引值不能大于等于数组的长度。

宏函数测试效果
重点提示:C语言和C++中定义多维数组的时候,规范的方法一般是要显式指定元素个数的,这里明知道多维数组元素个数,却还是要“统计”一下,只是为了测试这个宏函数的性能而已:

#include "stdio.h"
#define usual_arrlen(arr) sizeof(arr) / sizeof(arr[0])


int main() {
    int int_arr[] = {1,2,3};
    double double_arr[] = {0.1,0.2,0.3,0.4,0.5};
    size_t int_arrlen = usual_arrlen(int_arr);
    size_t double_arrlen = usual_arrlen(double_arr);
    // size_t为无符号整型,格式化输出可以使用%u说明符
    printf("int_arr数组中的元素个数为:%u\n", int_arrlen);
    printf("double_arr数组中的元素个数为:%u\n", double_arrlen);
    // 接下来测试一下多维数组是否适用
    int int_arr2[2][3] = {{1,2,3},{4,5,6}};
    size_t int_arrlen2 = usual_arrlen(int_arr2);
    printf("多维数组int_arr2中元素个数为:%u\n",int_arrlen2);
    return 0;   
}
代码编译后,得到输出:

int_arr数组中的元素个数为:3
double_arr数组中的元素个数为:5
多维数组int_arr2中元素个数为:2
免责声明:内容仅供参考,不保证正确性。
呐咯密密 发表于 2024-4-19 11:51 | 显示全部楼层
sizeof()运算符很常用
亚瑟 发表于 2024-4-23 14:06 来自手机 | 显示全部楼层
sizeof是函数还是运算符啊?
su1yirg 发表于 2024-4-24 15:34 | 显示全部楼层
获取长度用sizeof()确实很方便哦
tax2r6c 发表于 2024-4-24 16:43 | 显示全部楼层
经常使用sizeof()这个函数,尤其是做数据整理的时候
lamanius 发表于 2024-4-24 17:45 | 显示全部楼层
你可以使用以下的宏定义来获取数组的长度,#define ARRAY_LENGTH(arr) (sizeof(arr) / sizeof(arr[0])),这样也行的
l1uyn9b 发表于 2024-4-24 18:56 | 显示全部楼层
一般可以宏定义利用了C语言中的sizeof操作符来获取数组的总字节数,然后除以数组中单个元素的字节数,从而得到数组的长度
p0gon9y 发表于 2024-4-25 21:04 | 显示全部楼层
其实要是不嫌弃麻烦,用for也可以,不过没有sizeof()来的方便
610u 发表于 2024-8-27 00:29 | 显示全部楼层
宏函数 usual_arrlen 通过计算数组总大小除以单个元素的大小,来确定数组的元素个数。这种方法大部分时间是适用于一维数组
绒兔星球 发表于 2025-9-25 17:35 | 显示全部楼层
设计通用宏函数获取数组长度:#define ARRAY_LEN (arr) (sizeof (arr)/sizeof (arr [0]))。此宏通过数组总字节数除以单个元素字节数得长度,适用于任意类型数组。注意仅能直接用于数组,不可用于指针,否则结果错误。简洁高效,编译期计算,无运行时开销。
暖心小太阳 发表于 2025-9-28 19:43 | 显示全部楼层
学习了,这个宏函数在处理静态数组时非常实用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1296

主题

6239

帖子

15

粉丝
快速回复 在线客服 返回列表 返回顶部