如何使用指向数组的指针获取数组的大小
How do you get size of an array by using pointer to array?
我读过这个答案
解决您的问题 - 指向数组的指针对于传递 整个编译时已知大小的数组并保留有关 它在参数传递期间的大小。
但我真的不明白。在编译时不是已经知道给定大小的数组的大小吗?如果你有一个指向数组的指针,你如何获取数组的大小?举个例子:
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;
危险。但它有效。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 使用指针从C++中的数组中获取最大值
- 获取字符串的长度并将其分配给数组
- 数组长度,为什么从命令行获取时不能使用它?
- 如何在 nlohmann 的 json 库中获取数组长度?
- 在c++中获取两个大int,并将它们存储在数组中
- 如何在C++中获取二维数组中最少的一列数?
- 从 numpy 数组获取指针以将图像发送到C++
- 指针数组.获取指针元素的值
- 循环以使用 cstring 数组 c++ 获取用户输入
- 一种从元组/数组获取参数包的方法
- 如何使用数组获取输入,并将其存储在record.h类的主类中的变量中
- 如何使用数组获取命令行参数
- 从 JSON 数组获取天气
- 布尔数组获取意外的默认值
- 填充列表<>使用数组获取错误的数字
- 如何在C++中为矢量数据结构中的二维数组获取用户输入,而不使用行和列上的两个for循环
- 在自定义库中操作2d C++数组-获取行数
- 使用数组获取测试结果
- 数组c++获取值