如何在C中返回二维指针?
正如标题所示,如何像这样返回指针:如何在C中返回二维指针?,c,pointers,C,Pointers,正如标题所示,如何像这样返回指针: xxxxxxx foo() { static int arr[5][5]; return arr; } 顺便说一句,我知道我必须至少指定一个维度的大小,但如何指定?使用typedef有助于: typedef int MyArrayType[][5]; MyArrayType * foo(void) { static int arr[5][5]; return &arr; // NB: return pointe
xxxxxxx foo() {
static int arr[5][5];
return arr;
}
顺便说一句,我知道我必须至少指定一个维度的大小,但如何指定?使用typedef有助于:
typedef int MyArrayType[][5];
MyArrayType * foo(void)
{
static int arr[5][5];
return &arr; // NB: return pointer to 2D array
}
如果您出于某种原因不想使用typedef,或者只是想知道上述函数的裸体版本会是什么样子,那么答案是:
int (*foo(void))[][5]
{
static int arr[5][5];
return &arr;
}
希望您能理解为什么在这种情况下使用typedef是一个好主意。返回类型将是
int(*)[5]
(指向int
的5元素数组的指针),如下所示
int (*foo(void))[5]
{
static int arr[5][5];
...
return arr;
}
它分解为
foo -- foo
foo( ) -- is a function
foo(void) -- taking no parameters
*foo(void) -- returning a pointer
(*foo(void))[5] -- to a 5-element array
int (*foo(void))[5] -- of int
请记住,在大多数上下文中,“T的N元素数组”类型的表达式转换为“指向T的指针”类型。表达式
arr
的类型是“5元素数组的int
”的5元素数组,因此它被转换为“指向int
的5元素数组的指针”,或int(*)[5]
可能是typedef int MyArrayType[5]代码>取而代之?@ymfoi:好吧,可能有不止一种方法可以做到这一点——上面的解决方案适用于您的特定问题,但您可能试图做一些与您最初提出的不同的事情?是否要返回指向2D数组的指针?好的-我添加了一个上面没有typedef的版本-请不要这样编写代码!你需要注意C和C++之间的细微但重要的区别,它们在很多方面都是非常不同的语言,但是对于基本的POD类型,如上面的,那么你可以主要把它们看作是相似的。这是可怕的类型语法。我想我知道C。一个更好的问题是为什么你会想要返回一个。老实说,我想不出任何有意义的程序设计方式。@Lundin可能是一个返回2d数组指针的数据处理函数。这并不能解释为什么需要返回这样的指针,而不是使用作为函数参数之一传递的指针,这是C语言中的惯例。从函数返回指针通常清楚地表明程序设计不好。@Lundin你说得对。我知道使用该方法返回多个值非常方便。但我认为如果没有任何其他返回值,直接返回指针是很自然的。为什么这是一个糟糕的程序设计?你能详细解释一下吗?@Lundin很好。你的意思是返回值应该是一个错误代码而不是指针吗?谢谢你在C语法的残暴之上涂上了一层薄薄的理智。一旦你学会了基本规则,C声明语法实际上是相当简单的。丑陋,但直截了当。如果(*a)[5]
是指向数组的指针,那么(*f())[5]
是返回指向数组指针的函数。