如果我有:
char* buffer[8][8];
在同一个文件中,我想编写一个返回此缓冲区的函数,该函数的签名是什么样的?
如果是
char* buffer[8];
我会写
char** get_buff() {
return buffer;
}
但在这种情况下,我不能推导到多维数组。 C编译器会告诉我
char* buffer[8][8]
有类型
char * (*)[8]
问题是它给出的类型在签名中不是有效语法,所以我不知道它期望去那里的是什么。签名应该是什么样子的?
最佳答案
由于 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;
}
或者,通过参数返回指针是完全没问题的,尽管那样我们必须通过指针传递数组指针:
void get_buff (char* (**buf)[8][8])
{
*buf = &buffer;
}
关于c - 返回多维数组的 C 函数的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47625758/