使用指向c中数组的指针返回二维数组

问题描述 投票:0回答:1
#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 pointers 2d
1个回答
0
投票

但是在这段代码中为什么我们需要在返回类型之间写函数名

在 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
    数组的指针的函数。

因此,需要将名称嵌入声明器中,因为决定将声明作为名称将如何使用的图片。

© www.soinside.com 2019 - 2024. All rights reserved.