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
相关产品推荐
相关产品推荐

