【问题标题】:What does " int (*get_2d_array(void))[3] " function declaration in following code mean? [duplicate]以下代码中的“ int (*get_2d_array(void))[3] ”函数声明是什么意思? [复制]
【发布时间】:2017-10-01 18:22:22
【问题描述】:
int (*get_2d_array(void))[3]    //This Function
{
    static int arr[2][3] = { 10, 20, 30, 40, 50, 60 };
    return arr;
}


int main()
{

int i, j, row = 2, col = 3;
int (*ptr)[col];

ptr = get_2d_array();

for( i = 0; i < row; i++ )
{
    for( j = 0; j < col; j++ )
    {
        printf("%d ",ptr[i][j]);
    }
    printf("\n");
} 
    return 0;
}

这个函数被声明为一个数组,任何人都可以解释这种类型的声明。

函数输出是打印被调用函数返回的数组。

【问题讨论】:

  • 将其插入translator
  • 这是一个很棒的工具,但我想要一个详细的答案。正如我所说,我知道输出,但我想知道这个函数是如何工作的?
  • 你没有问函数是如何工作的。你问int (*get_2d_array(void))[3] 是什么意思。

标签: c multidimensional-array


【解决方案1】:

函数返回指向大小为 3 的 int 数组的指针。

您以后可以使用https://cdecl.org等解决方案进行翻译。

但是,我在某处找到了一种无需使用外部工具即可“翻译”的方法。您从标识符开始阅读,然后向右移动,当您遇到右括号时,您会“反弹”。

使用您的功能,它的工作原理如下:

  • 您以标识符开头:get_2d_array,所以我们有“get_2d_array 是...”

  • 当我们有(void) 时,我们向右移动,所以它看起来像一个函数声明:“get_2d_array 是一个不带参数并返回的函数......”

  • 我们向右移动,遇到不平衡的右大括号,所以我们反弹并发现一个星号,它表示一个指针;因此,我们有“get_2d_array 是一个不带参数并返回指向...的指针的函数”

  • 好的,我们又遇到了[3],所以我们将它插入到我们的句子中:“get_2d_array 是一个不带参数的函数,并返回一个指向大小为 3 的数组的指针... "

  • 我们最后没有解释的是开头的'int',所以我们终于有了:“get_2d_array 是一个不带参数并返回一个指向大小为 3 的数组的指针的函数int"

【讨论】:

  • 这个解释真棒!!!但是该函数返回一个二维数组。那怎么办??
【解决方案2】:

int (*get_2d_array(void))[3] 不接受任何参数 (void) 并返回一个指向整数数组的指针,该数组在第二维(“列”)中有 3 个元素。

【讨论】:

  • 如果是这样,那么这样对吗? int *get_2d_array(void)[3] 因为如果它是一个返回 3 列的 int 指针数组,那么应该省略括号。否则它的返回类型是整数
  • 实际上可能不是因为优先级。让我检查一下。
  • 确实,检查this one。没有括号,返回类型将是 int 指针数组。
  • 对不起,我一开始没有理解你的评论。如果您想要指向数组的指针而不是指针数组,那么这是正确的,此时 arr 肯定不在。编译器在第二个版本上抛出警告。它不是返回一个整数,而是正如答案中所说的那样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
  • 1970-01-01
  • 2018-05-05
  • 2017-12-21
  • 1970-01-01
  • 2011-04-12
  • 2012-10-03
相关资源
最近更新 更多