c - 返回多维数组的 C 函数的签名

标签 c multidimensional-array syntax

如果我有:

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/

相关文章:

c - 将指针设置为 NULL 会产生 "assignment makes integer from pointer without a cast"警告

c - 求Eclipse简单可视化单元测试总结

json - 使用 2d slice 嵌套 json 解码到结构中在 golang 中不起作用

ios - 如何在 Swift if 语句中捕获 0 的返回值?

c - && 运算符在两个字符串之间时有何作用?

c - 错误的宏定义导致 "Expected expression"错误

c - gcc multiple -o 选项如何工作?

php - 分组和添加值多维数组

以object[]和object[][]为参数的C#调用方法(params object[][])

syntax - 在 Mathematica 中将控制定义为变量