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

问题描述 投票:3回答:7

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

以下是我的代码:

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

mystruct *m_arr[2];

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

c++ arrays pointers
7个回答
8
投票

不要使用原始数组。使用像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)不包括声明中的大小。


6
投票

通常的做法是:

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

关于来自size_twiki

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


4
投票

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

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


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()访问它的大小,以及你用m_arr.data()获得的底层原生数组的地址。


1
投票

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


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


0
投票

假设您的数组如下:

char *array[3];  

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.