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

时间:2018-08-27 08:47:31

标签: c++ arrays pointers

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

下面是我的代码:

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

mystruct *m_arr[2];

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

7 个答案:

答案 0 :(得分:8)

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

    for (mystruct* p : m_arr)

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


编辑:原始数组还支持基于范围的语法-但仅 ,如果可见声明包含元素数(因此my_struct* m_arr[2];很好,但是{{1} }无效)。也必须在不定义大小的情况下声明my_struct* m_arr[]。  其他容器(例如std::array)  不要在声明中包含大小。

答案 1 :(得分:6)

通常的做法是:

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

关于wiki中的size_t

  

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

答案 2 :(得分:4)

如果这是使用m_arr的所有其他源代码文件所包含的头文件,则可以使用sizeof(m_arr)/sizeof(m_arr[0])获取数组中元素的数量。但这确实很危险。如果指针m_arr在某个时刻进入函数作为参数,则函数的作用域不会在sizeof(m_arr)返回2,而是指针在内存中占用的字节数,大概为8。 / p>

因此,如果要坚持使用普通C语言,则必须在单独的变量中传递元素数量。但是,如果可以使用C ++,则可以使用各种更好,更安全,甚至更快的解决方案。

答案 3 :(得分:3)

您始终可以执行此类内存运算:

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()访问,并使用{{1}获得的底层本机数组的地址。 }。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

是的,请使用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的视频中看到了这一点

答案 6 :(得分:0)

假设您的数组如下:

char *array[3];  

在数组中添加一个额外的项,它被视为数组终止符。

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

其余内容取决于您自己的编码样式,您可以检查终止符并计算除终止字符串以外的元素数。