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

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::vectorstd::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的视频中看到了这一点

【讨论】:

以上是关于如何获取指针数组中的元素数量?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取数组中的最后一个键?

如何获取分区中的元素数量? [复制]

如何获取在 C++ 中排序后保留的列表元素的指针

如何获取无缓冲通道中的元素数量

php 如何取出数组中第一个和最后一个元素的值

js如何获取鼠标在某元素移动时~鼠标指针在元素中的坐标?