2014-12-05 193 views
1

我看了这个答案如何通过使用指向数组的指针来获取数组的大小?

Adressing你的问题 - 指针数组是有用的通过编译时已知大小的 整个阵列和保存信息过程中的参数传递约 它的大小。

但我并不真正了解它。在编译时已经知道给定大小的数组的大小不是?如果你有一个指向它的指针,你如何得到数组的大小?举这个例子:

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

} 

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

} 

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

+2

*“如果你有一个指向它的指针,你如何得到数组的大小?”*你不知道。如果你有一个指向数组的指针,但不知道你是SOL的大小。这就是为什么你避免使用原始数组,并使用'std :: vector'或'std :: array',因为他们随身带着这些信息 – CoryKramer 2014-12-05 14:32:35

+0

如果你看起来很奇怪,数组就会衰变成指针。 – Borgleader 2014-12-05 14:32:43

+0

您不必将尺寸[5]放在那里,[]就足够了。而“5”只是阅读代码的人的文档。 – gnasher729 2014-12-05 14:33:29

回答

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

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终止符推导出来的。

当涉及到整数数组(无数终止符的数组)时,我会说它们不是自包含的,因为传递指向数组的指针不会让该函数推导出数组的大小。你必须明确地传递大小。

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中最好,在那里你没有模板。

+0

是的,但由于您必须对大小进行硬编码,因此这种方法非常没用。而在有VLA的情况下,无论如何你都必须通过这个尺寸。 – 2501 2014-12-05 14:54:09

0

如果你有一个指针p指向数组
并且你想获得数组的大小。
尝试size_t array_size = *(size_t*)p;
危险。但它的工作。