我已经阅读了这个答案
解决你的问题 - 指向数组的指针很有用 整个编译时已知大小的数组并保存有关的信息 在论证过程中它的大小。
但我真的不明白。编译时是否已知具有给定大小的数组的大小?如果你有一个指向它的指针,你如何获得数组的大小?举个例子:
void func(int (*array)[5])
{
}
// identical to
void func(int *array, int size)
{
}
你必须把5放在那里,那有什么意义呢?除非你已经知道它的大小,否则你仍然无法迭代它。
答案 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;
危险的。但它确实有效。