如何获取指针数组中的元素数量?

How to get number of elements in the array of pointers?

本文关键字:元素 数组 指针 何获取 获取      更新时间:2023-10-16

如何获取指针数组中的元素数?

下面是我的代码:

struct mystruct     
{    
int a;    
char ch[10];    
int c;    
};
mystruct *m_arr[2];

我正在其他一些文件中遍历此数组。我想以编程方式获取数组中的元素数,而不是在每个文件中硬编码为 2。

不要使用原始数组。 使用标准容器,如std::vectorstd::array。 这两者都有一个.size()成员,并允许基于范围的语法:

for (mystruct* p : m_arr)

如果需要 C 兼容性,它们都提供了一个data()成员函数,该函数返回指向基础数组中第一个元素的指针。 (在您的情况下,这将是一个mystruct **(


编辑:原始数组还支持基于范围的语法 - 但前提是可见声明包含元素的数量(所以my_struct* m_arr[2];很好,但my_struct* m_arr[]不起作用(。 如果不定义大小,就不可能声明std::array。 其他容器(如std::vector( 不要在声明中包含大小。

通常的方法是:

size_t sizeOfArray = sizeof(m_arr)/sizeof(m_arr[0]);

关于维基size_t

size_t 是一个无符号整数类型,用于表示特定实现中任何对象(包括数组(的大小。sizeof 运算符生成类型为 size_t 的值。size_t的最大大小通过 SIZE_MAX 提供, 是在标头中定义的宏常量(C++ 中的 cstdint 标头(。size_t保证至少为 16 位宽。

如果这是使用m_arr的所有其他源代码文件包含的头文件,则可以使用sizeof(m_arr)/sizeof(m_arr[0])来获取数组中的元素数。但这真的很危险。如果在某个时候指针m_arr输入一个函数作为参数,则该函数的作用域将不会返回 2sizeof(m_arr)而是指针在内存中占用的字节数,可能是 8。

因此,如果你想坚持使用普通C,那么你必须在一个单独的变量中传递元素的数量。但是,如果您可以使用C++那么还有各种更好,更安全甚至更快的解决方案。

你总是可以做这样的内存算术:

size_t arraySize = sizeof(m_arr) / sizeof(m_arr[0]);

但是,如果您没有像何时使用数组而不是向量/字符串这样的原因?

然后你应该使用一个std::array<mystruct*, 2> m_arr;,你可以通过m_arr.size()访问它的大小,以及你通过m_arr.data()获得的底层原生数组的地址。

在 C++17 中,您可以#include <iterator>并使用std::size(m_arr)

假设您的数组如下所示:

char *array[3];  

向数组添加一个额外的项,该项被视为用作数组终止符。

char *array[3]={"First element","Second element",""};

其余的取决于你自己的编码风格,你可以检查终止符并计算除终止字符串之外的元素数量。

是的,使用 std::vector,但如果必须...

这适用于 C++11 或更高版本:

template <typename T, std::size_t N>
constexpr std::size_t sizeofArray(T(&)[N]) {
return N;
}

最近在一段关于您今天可以采用的 7 个 C++ 功能的视频中看到了这一点