【发布时间】:2016-08-28 15:19:06
【问题描述】:
我想返回一个指向我刚刚传递的数组的指针。为什么我不允许?
int(*func(int arr[10]))[10]
{
return arr;
}
【问题讨论】:
我想返回一个指向我刚刚传递的数组的指针。为什么我不允许?
int(*func(int arr[10]))[10]
{
return arr;
}
【问题讨论】:
因为当你将一个数组传递给一个函数时,它会衰减为一个指针,更准确地说是一个指向第一个元素的指针。
在您的示例中,参数 arr 实际上是一个 指针 而不是数组(这也是为什么您不能在“数组”上使用 sizeof 来获取大小的指针而不是它指向的内容)。当您声明 int arr[X] 之类的参数时(X 的值无关紧要),它实际上等同于声明 int *arr。当您知道实际返回类型应该是什么时也非常清楚:int*:
int* func(int* arr)
{
return arr;
}
消除疑虑或歧义的一种方法是改用std::array:
std::array<int, 10>& func(std::array<int, 10>& arr)
{
return arr;
}
作为旁注,如果你有一个 实际 整数数组,比如说
int arr[10] = { ... };
然后要获得指向它的指针(类型为int (*)[10]),那么您必须像往常一样使用地址运算符:
&arr;
关于您的评论,假设您在函数中有一个 static 数组,以及将实际 指针 返回到该数组的内容,那么您将不得不使用那个“奇怪”的返回 -类型语法。
int (*func(int x))[10]
{
static int arr[10] = { ... }; // Define and initialize array
// Some other code...
return &arr; // Return a POINTER to the array
}
在上面的函数中,arr 的类型是int[10]。一个指向数组的指针,是你在使用&arr 时得到的,它的类型是int(*)[10]。
现在将此类型作为返回类型扩展为我们得到 int (*func(...))[10] 的函数。
如上所述,使用 std::array 会更清楚 (IMO)。
【讨论】:
int (*func(int a))[10]。如果我可以按照您的建议返回一个数组,为什么我需要声明一个返回的数组大小?