如何通过使用指向数组的指针来获得数组的大小?

时间:2014-12-05 14:29:59

标签: c++

我已经阅读了这个答案

  

解决你的问题 - 指向数组的指针很有用   整个编译时已知大小的数组并保存有关的信息   在论证过程中它的大小。

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

void func(int (*array)[5])
{

}

// identical to
void func(int *array, int size)
{

}

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

4 个答案:

答案 0 :(得分:3)

  

编译时是否已知具有给定大小的数组的大小?

是的,他们是。

  

如果你有一个指向它的指针,你怎么得到数组的大小?

你没有。

  

你必须把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 ++,在这种情况下没有引用或模板。)< / p>

答案 1 :(得分:1)

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数组)时,我会说它们不是自包含的,因为传递指向数组的指针不会让该函数推断出数组的大小。你必须明确地传递大小。

答案 2 :(得分:1)

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中效果最好,你没有模板。

答案 3 :(得分:0)

如果指针p指向数组
并且你想获得数组大小 试试size_t array_size = *(size_t*)p;
危险的。但它确实有效。