返回多维数组的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后面是个坏主意