You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中返回二维数组时,为何函数声明要写成int (*createArray())[3]?

C语言中返回二维数组的函数声明解析
#include <stdio.h>

int (*createArray())[3] {
    static int arr[2][3] = {{1, 2, 3}, {4, 5, 6}};
    return arr;  
}

int main() {
    int (*ptr)[3] = createArray();

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

在这段代码中,返回二维数组时函数声明为int (*createArray())[3]。我们常规的函数声明格式为:

return_type function_name ( parameter_list)
{
   // function body
}

想请教为何在该场景下需要将函数名写在返回类型的中间?


这得从C语言的声明与使用一致核心规则说起——你怎么用一个标识符,就怎么写它的声明。

首先明确:C语言里不能直接返回二维数组本身(数组无法作为函数返回值),所以这里实际返回的是指向"包含3个int元素的一维数组"的指针,而这个指针类型的写法是int (*)[3]。

现在来看int (*createArray())[3]的拆解逻辑:

  • 先看createArray():这部分表示createArray是一个无参数的函数;
  • 再套一层括号(*createArray()):表示这个函数的返回值是一个指针;
  • 最后加上[3]:说明这个指针指向的是一个有3个int元素的数组;
  • 最前面的int:指定数组元素的类型是int。

之所以不能写成int (*)[3] createArray()这种"常规格式",是因为C的语法规则要求函数名必须紧跟在参数列表的括号前,所以必须把函数名嵌入到复合返回类型的结构中,才能准确表达"返回一个指向3元素int数组的指针"这个含义。

换个角度理解:当我们在main函数里用int (*ptr)[3] = createArray();接收返回值时,ptr的类型是int (*)[3],那函数createArray的返回类型就是这个。按照声明规则,要把函数名放在"调用它的方式"里——也就是createArray()是函数调用,所以用(*createArray())表示函数返回的指针,再加上[3]说明指针指向的数组大小,最终就形成了这个看似特殊的声明格式。

内容的提问来源于stack exchange,提问作者Baranitharan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:12:45