c/c++开发分享循环固定大小的数组而不在C中定义其大小

一些示例代码来启动问题:

#define FOO_COUNT 5 static const char *foo[] = { "123", "456", "789", "987", "654" }; 

通常迭代的方式,如一个例子,如下:

 int i = FOO_COUNT; while (--i >= 0) { printf("%sn", foo[i]); 

无论如何,如果没有明确地将人数统计为数字5,是否仍然可以做到这一点? 在将来,我可能会添加/删除元素,忘记更新数组的大小,从而破坏我的应用程序。

     int i = sizeof(foo)/sizeof(foo[0]); 

    最后使用一个标记,例如NULL:

     static const char *foo[] = { "123", "456", "789", "987", "654", NULL }; for (char *it = foo[0]; it != NULL; it++) { ... } 

    通常的方法是使用NULL结束数组并迭代直到你点击它。

    是。

     int i = sizeof(foo) / sizeof(char*); 

    注意:这仅适用于静态分配的数组。 它不适用于malloc ed或new ed数组。

     size_t i = sizeof foo / sizeof *foo; // or sizeof foo / sizeof foo[0] 

    这将foo数组中的总字节数( sizeof foo )除以单个元素( sizeof *foo )中的字节数,从而给出数组中的元素数。

    C99中还有另一种方法,特别是如果你想要命名索引,允许实例化本地化等。

     enum STRINGS { STR_THING1, STR_THING2, STR_THING3, STR_THING4, STR_WHATEVER, STR_MAX /* Always put this one at the end, as the counting starts at 0 */ /* this one will be defined as the number of elements */ } static const char *foo[STR_MAX] = { [STR_THING1] = "123", [STR_THING2] = "456", [STR_THING3] = "789", [STR_THING4] = "987", [STR_WHATEVER] = "OR Something else", }; 

    通过使用命名的初始化程序,即使枚举值发生变化,程序仍然是正确的。

     for (i = STR_THING1; i 

    或者使用指定索引的程序中的任何位置

      printf("thing2 is %sn", foo[STR_THING3]); 

    此技术可用于模拟资源包。 使用语言变体声明一个enum和几个字符串数组,并在程序的其余部分使用指针。 简单快速(特别是在64位机器上,获取常量(字符串)的地址可能相对昂贵。编辑:sizeof foo / sizeof * foo技术仍然适用于此。

    是。

    的sizeof(富)/的sizeof(字符*)

    是5。

    对于某些应用程序, 尝试Catch将工作。

      以上就是c/c++开发分享循环固定大小的数组而不在C中定义其大小相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545818.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注