如何获取指针数组中的元素数量?
Posted
技术标签:
【中文标题】如何获取指针数组中的元素数量?【英文标题】:How to get number of elements in the array of pointers? 【发布时间】:2018-08-27 08:47:31 【问题描述】:如何获取指针数组中的元素个数?
下面是我的代码:
struct mystruct
int a;
char ch[10];
int c;
;
mystruct *m_arr[2];
我正在其他一些文件中遍历这个数组。我想以编程方式获取数组中元素的数量,而不是在每个文件中硬编码为 2。
【问题讨论】:
您正在使用 C++ 编程。所以使用std::vector
。
或者std::array<mystruct,2>
,如果大小确实是固定的。无论哪种方式,选择一种语言。您在这里混合使用了 C 和 C++。
std::begin 和 std::end 也适用于数组
@AndrewKashpur:不适用于extern mystruct *m_arr[ ]
。这个问题只包含m_arr
的定义,但只有一个翻译单元有定义。其余代码处理声明。
【参考方案1】:
不要使用原始数组。使用像std::vector
或std::array
这样的标准容器。这两个都有一个.size()
成员,并允许基于范围的 for 语法:
for (mystruct* p : m_arr)
如果您需要 C 兼容性,它们都提供了 data()
成员函数,该函数返回指向底层数组中第一个元素的指针。 (在你的情况下,这将是一个mystruct **
)
编辑:原始数组也支持基于范围的 for 语法 - 但 仅 如果可见声明包含元素的数量(所以 my_struct* m_arr[2];
很好,但 my_struct* m_arr[]
不起作用)。如果不定义大小,就不可能声明std::array
。
其他容器(如std::vector
)
不要在声明中包含大小。
【讨论】:
【参考方案2】:通常的做法是:
size_t sizeOfArray = sizeof(m_arr)/sizeof(m_arr[0]);
关于size_t
来自wiki:
size_t 是一个无符号整数类型,用于表示特定实现中任何对象(包括数组)的大小。 sizeof 运算符产生一个 size_t 类型的值。 size_t 的最大大小是通过 SIZE_MAX 提供的,它是一个宏常量,在标头(C++ 中的 cstdint 标头)中定义。 size_t 保证至少为 16 位宽。
【讨论】:
在某些平台上可以使用_countof
宏:size_t sizeOfArray = _countof(m_arr)
;【参考方案3】:
如果这是使用m_arr
的所有其他源代码文件包含的头文件,您可以使用sizeof(m_arr)/sizeof(m_arr[0])
获取数组中的元素数。但这真的很危险。如果在某个时刻指针 m_arr
作为参数进入函数,函数的作用域将不会在 sizeof(m_arr)
返回 2,而是指针在内存中占用的字节数可能是 8。
因此,如果您想坚持使用纯 C,则必须在单独的变量中传递元素的数量。但是,如果您可以使用 C++,那么还有各种更好、更安全、甚至更快的解决方案。
【讨论】:
【参考方案4】:你总是可以做这样的记忆算法:
size_t arraySize = sizeof(m_arr) / sizeof(m_arr[0]);
但是如果你没有像When would you use an array rather than a vector/string?这样的理由:
那么你应该使用std::array<mystruct*, 2> m_arr;
,你可以通过m_arr.size()
访问它的大小,以及你通过m_arr.data()
获得的底层原生数组的地址。
【讨论】:
【参考方案5】:在 C++17 中,您可以使用 #include <iterator>
并使用 std::size(m_arr)
。
【讨论】:
或者自己用 C++14 实现它(不是一个过于复杂的结构)。我不相信这取决于 C++17 中的任何核心语言变化。【参考方案6】:假设您的数组如下:
char *array[3];
在数组中添加一个额外的项,它被认为是作为数组终止符。
char *array[3]="First element","Second element","";
剩下的就看你自己的编码风格了,你可以检查终止符,统计除终止字符串以外的元素个数。
【讨论】:
【参考方案7】:是的,使用 std::vector,但如果必须...
这适用于 c++11 或更高版本:
template <typename T, std::size_t N>
constexpr std::size_t sizeofArray(T(&)[N])
return N;
最近在一个关于7 Features of C++ You Can Adopt Today的视频中看到了这一点
【讨论】:
以上是关于如何获取指针数组中的元素数量?的主要内容,如果未能解决你的问题,请参考以下文章