如何使用指向数组的指针获取数组的大小

How do you get size of an array by using pointer to array?

本文关键字:数组 获取 指针 何使用      更新时间:2023-10-16

我读过这个答案

解决您的问题 - 指向数组的指针对于传递 整个编译时已知大小的数组并保留有关 它在参数传递期间的大小。

但我真的不明白。在编译时不是已经知道给定大小的数组的大小吗?如果你有一个指向数组的指针,你如何获取数组的大小?举个例子:

void func(int (*array)[5])
{
}
// identical to
void func(int *array, int size)
{
}

你必须把 5 放在那里,那么它有什么意义呢?除非您已经知道大小,否则您仍然无法迭代它。

编译时不是已经知道给定大小的数组的大小吗?

是的,他们是。

如果你有一个指向数组的指针,你如何获取数组的大小?

你没有。

你必须把 5 放在那里,那么它有什么意义呢?

它可以防止错误。您只能将正确大小的数组传递给此函数;如果您尝试传递指针或大小错误的数组,编译器将拒绝它。

除非您已经知道大小,否则您仍然无法迭代它。

您可以从数组类型中获取大小:

size_t size = sizeof(*array) / sizeof(**array);      // old school
size_t size = std::extent<decltype(*array)>::value;  // C++11 or later
size_t size = std::size(*array);                     // the future, maybe

或者,您可以将函数设置为模板,可用于任何数组大小:

template <size_t N>
void func(int (&array)[N])
{
    for (int i : array) // size is known
       std::cout << i << 'n';
}

(我还将类型更改为引用而不是指针,以使语法更清晰。您引用的答案可能是针对 C,而不是针对C++,在这种情况下没有引用或模板。

Adressing your question - pointer to array is useful to pass an 
entire array of compile-time known size and preserve information
 about its size during argument passing.

这仅适用于 char 数组,因为您不需要显式传递数组的大小,因为它是由 null 终止符推导的。

当涉及到整数数组(没有终止符的OR数组)时,我会说它们不是自包含的,因为将指针传递给数组不会让该函数推断数组的大小。您必须显式传递大小。

Mike Seymour 对模板示例的回答使我点击了您可以在此处使用 sizeof 运算符。

void func(int (*array)[5])
{
    std::size_t n = sizeof(*array) / sizeof(**array);
    std::cout << n;
}
int main()
{
    int array[5] = { 1, 2, 3, 4, 5 };
    func(&array);
}
此方法在 C

中效果最好,因为 C 没有模板。

>如果你有一个指向数组
p指针并且您想要获取数组大小。
试试size_t array_size = *(size_t*)p;
危险。但它有效。