#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 语言中,编写声明是为了给出如何使用变量的“图片”。 Kernighan 和 Ritchie 在 C 编程语言,1978 年,第 90 页中写道:
指针
的声明是新的。px
int *px;
旨在作为助记符;它表示组合
是一个*px
,也就是说,如果int
出现在上下文px
中,则它相当于*px
类型的变量。实际上,变量声明的语法模仿了该变量可能出现的表达式的语法。这种推理在所有涉及复杂声明的情况下都很有用。例如,int
double atof(), *dp;
表示在表达式中
和atof()
具有*dp
类型的值。double
所以
int (*createArray())[3]
说:
(*createArray())[3]
的类型是int
。(*createArray())
是一个由3个int
组成的数组。createArray()
是一个指向3个int
的数组的指针。createArray
是一个返回指向 3 int
数组的指针的函数。因此,需要将名称嵌入声明器中,因为决定将声明作为名称将如何使用的图片。