【问题标题】: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的定义,但只有一个翻译单元有定义。其余代码处理声明。

标签: c++ arrays pointers


【解决方案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的视频中看到了这一点

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-01-07
            • 1970-01-01
            • 1970-01-01
            • 2010-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多