Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回指向传递给参数列表的数组的指针_C++_Arrays_Pointers - Fatal编程技术网

C++ 返回指向传递给参数列表的数组的指针

C++ 返回指向传递给参数列表的数组的指针,c++,arrays,pointers,C++,Arrays,Pointers,我想返回一个指向我刚刚传递的数组的指针。为什么不允许我这么做 int(*func(int arr[10]))[10] { return arr; } 因为当您将数组传递给函数时,它会衰减为指针,更准确地说是指向第一个元素的指针 在您的示例中,参数arr实际上是一个指针,而不是数组(这也是为什么您不能在“数组”上使用sizeof,它获取指针的大小,而不是指针指向的内容)。当您声明一个参数,例如int-arr[X](X的值无关紧要)时,它实际上等同于声明int*arr。当您知道实际的返回类

我想返回一个指向我刚刚传递的数组的指针。为什么不允许我这么做

int(*func(int arr[10]))[10]
{
    return arr;
}

因为当您将数组传递给函数时,它会衰减为指针,更准确地说是指向第一个元素的指针

在您的示例中,参数
arr
实际上是一个指针,而不是数组(这也是为什么您不能在“数组”上使用
sizeof
,它获取指针的大小,而不是指针指向的内容)。当您声明一个参数,例如
int-arr[X]
X
的值无关紧要)时,它实际上等同于声明
int*arr
。当您知道实际的返回类型应该是什么时,也非常清楚:
int*

int* func(int* arr)
{
    return arr;
}
一种消除疑问或歧义的方法是使用:

然后,要获取指向该地址的指针(类型为
int(*)[10]
),则必须像往常一样使用运算符的地址:

&arr;

关于您的注释,假设您在函数中有一个
静态
数组,以及如何返回指向该数组的实际指针,那么您将不得不使用“奇怪的”返回类型语法

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]


如上所述,使用会更清楚(IMO)。

OP没有调用该函数。她的问题是关于函数声明,而不是函数调用。@KerrekSB我要说的是…:)@JoaCHIMPILBORG正在阅读C++入门,我实际上重读了有关函数返回数组和函数指针的部分。有一个函数返回指向数组的指针的示例,其声明如下:
int(*func(int a))[10]
。如果我可以按照您的建议返回数组,为什么我需要声明返回的数组大小?@vdublevsky更新了我对您评论的回答。这里要知道的重要一点是,衰减为指针的数组与指向该数组的指针不同。@JoachimPileborg谢谢!似乎我需要做一些关于数组衰减为指针与指针衰减为数组的研究
&arr;
int (*func(int x))[10]
{
    static int arr[10] = { ... };  // Define and initialize array
    // Some other code...
    return &arr;  // Return a POINTER to the array
}