返回多维数组的C函数的签名
如果我有:返回多维数组的C函数的签名,c,multidimensional-array,syntax,C,Multidimensional Array,Syntax,如果我有: char* buffer[8][8]; 在同一个文件中,我想写一个返回这个缓冲区的函数,这个函数的签名是什么样的 就 char* buffer[8]; 我会写 char** get_buff() { return buffer; } 但在这种情况下,我无法将遵从性转换为多维数组。C编译器会告诉我 char* buffer[8][8] 有类型 char * (*)[8] 问题是它给出的类型在签名中不是有效的语法,所以我不知道它希望得到什么。签名应该是什么样的 您可以使
char* buffer[8][8];
在同一个文件中,我想写一个返回这个缓冲区的函数,这个函数的签名是什么样的
就
char* buffer[8];
我会写
char** get_buff() {
return buffer;
}
但在这种情况下,我无法将遵从性转换为多维数组。C编译器会告诉我
char* buffer[8][8]
有类型
char * (*)[8]
问题是它给出的类型在签名中不是有效的语法,所以我不知道它希望得到什么。签名应该是什么样的 您可以使用typedef。这包括:
typedef char* (*tp)[8];
char* buffer[8][8];
tp get_buff()
{
return buffer;
}
int main()
{
}
tp的类型是指向字符的8指针数组。这将返回一个指向缓冲区第一个元素的指针。缓冲区的每个元素都有指向char的8指针数组类型
注意,缓冲区的类型实际上是8个数组的数组,8个指向字符的指针。但是由于数组到指针的衰减,它会衰减为指向第一个元素的指针,这是tp的类型。您可以使用typedef。这包括:
typedef char* (*tp)[8];
char* buffer[8][8];
tp get_buff()
{
return buffer;
}
int main()
{
}
tp的类型是指向字符的8指针数组。这将返回一个指向缓冲区第一个元素的指针。缓冲区的每个元素都有指向char的8指针数组类型
注意,缓冲区的类型实际上是8个数组的数组,8个指向字符的指针。但是由于数组到指针的衰减,它衰减为指向第一个元素的指针,该元素是tp类型。由于C语言的限制,您无法从函数返回数组。只能返回指向数组的指针 使用指向第一个元素的指针将是最容易的。案例中的第一个元素是
char*
,因此指向该元素的指针应该是char**
。请注意,指针到指针语法与数组本身无关
// my recommended solution
char** get_buff (void)
{
return &buffer[0][0];
}
如果希望返回一个指向整个数组的指针,它将变得更加复杂。高级主题如下 指向类型为
char*buffer[8][8]的数组的数组指针代码>声明为char*(*ptr)[8][8]
。这是指向整个数组的指针。也可以只使用指向第一个元素的指针,即char*(*)[8]
如果希望返回数组指针,其C语法非常糟糕:
char* (*get_buff(void))[8][8]
{
return &buffer; // return address of array
}
这完全不可读。要避免这种C疯狂语法,我们应该做的是对数组类型使用typedef,然后返回指向此类类型的指针:
typedef char* c_arr_8x8 [8][8];
c_arr_8x8* get_buff (void)
{
return &buffer;
}
或者,通过一个参数返回指针也很好,不过我们必须逐个指针传递数组指针:
由于C语言的限制,您无法从函数返回数组。只能返回指向数组的指针
使用指向第一个元素的指针将是最容易的。案例中的第一个元素是char*
,因此指向该元素的指针应该是char**
。请注意,指针到指针语法与数组本身无关
// my recommended solution
char** get_buff (void)
{
return &buffer[0][0];
}
如果希望返回一个指向整个数组的指针,它将变得更加复杂。高级主题如下
指向类型为char*buffer[8][8]的数组的数组指针代码>声明为char*(*ptr)[8][8]
。这是指向整个数组的指针。也可以只使用指向第一个元素的指针,即char*(*)[8]
如果希望返回数组指针,其C语法非常糟糕:
char* (*get_buff(void))[8][8]
{
return &buffer; // return address of array
}
这完全不可读。要避免这种C疯狂语法,我们应该做的是对数组类型使用typedef,然后返回指向此类类型的指针:
typedef char* c_arr_8x8 [8][8];
c_arr_8x8* get_buff (void)
{
return &buffer;
}
或者,通过一个参数返回指针也很好,不过我们必须逐个指针传递数组指针:
函数不能返回数组。在大多数情况下,数组类型的表达式会自动转换为数组第一个元素的指针,这可能正是您想要的(除非您想要返回缓冲区的副本,这完全是另一回事)
因此,函数中的return语句应该如下所示:
return buffer;
类型char*(*)[8]
是正确的,您完全可以使用它编写签名。这一点一开始并不太明显,但实际上并不复杂:
char *(*get_buff())[8] {
return buffer;
}
经验法则是:如果一个类型中有一个顶级(*)
,则将函数名和参数粘贴在*
后面以获得签名。像这样:
char * ( * )[8]
^
|
get_buffer()
对于多级指针也是一样:函数名位于(******…***)中最后一个*
之后
当然,您可以使用typedefs稍微简化一下。函数不能返回数组。在大多数情况下,数组类型的表达式会自动转换为数组第一个元素的指针,这可能正是您想要的(除非您想要返回缓冲区的副本,这完全是另一回事)
因此,函数中的return语句应该如下所示:
return buffer;
类型char*(*)[8]
是正确的,您完全可以使用它编写签名。这一点一开始并不太明显,但实际上并不复杂:
char *(*get_buff())[8] {
return buffer;
}
经验法则是:如果一个类型中有一个顶级(*)
,则将函数名和参数粘贴在*
后面以获得签名。像这样:
char * ( * )[8]
^
|
get_buffer()
对于多级指针也是一样:函数名位于(******…***)中最后一个*
之后
当然,你可以使用Type Debug来简化这件事。如果是关于C,为什么你要标记C++?我在这两个方面都在工作。这种语法在C和C++中都是工作的,不能用C返回数组。只有返回一个数组的指针才是可能的。如果是关于C的,为什么你要标记C++?我在这两个方面都工作。这种语法在C和C++中都适用。在C中不能返回数组。只能返回指向数组的指针。将指针隐藏在t后面是个坏主意