【问题标题】:What is int (*tabes)[N]?什么是 int (*tabes)[N]?
【发布时间】:2021-05-15 14:06:03
【问题描述】:

1 问题 - 指针在此代码中的作用 2 问题-当我们传递一个二维数组时,为什么函数的参数是一维数组

#define N 10
int tab[N][N]

void create(int (*tabes)[N]){
     for (i=0; i<N; i++){
       for (j=0; j<N; j++){
          tabes[i][j] = 2;
       }
    }
}

int main(){
    create(tab);
}

【问题讨论】:

  • 请提供minimal, reproducible example。这个问题目前很模糊。
  • 参数是一个指向大小为 N 的 int 数组的指针。
  • 当前发布的代码中没有动态分配。 int tab[N][N] 是传递给void create(int (*tabes)[N]) 函数的静态int 数组(缺少;,因此无法编译...)。
  • 当我们传递一个二维数组时,为什么函数的参数是一维数组?百万美元的问题,如果你问自己这个问题,你在正确的轨道上,请阅读 C-FAQ 上的数组和指针部分c-faq.com/aryptr/index.html

标签: c pointers multidimensional-array implicit-conversion function-parameter


【解决方案1】:

仅使用指针的动态数组分配

对于初学者,您的问题中提供的代码中没有动态数组分配。所以问题的标题很混乱。

您忘记放置分号的数组声明

int tab[N][N]

声明一个具有静态存储持续时间的数组。

将标题更改为之后

什么是 int (*tabes)[N]?

然后简单地说,它是一个名为 tabes 的指针的声明,它指向数组类型 int[N] 的对象。

2 问题 - 为什么函数的参数是一维数组 当我们传递一个二维数组时

我想你是想说为什么函数的参数是一维数组,因为函数调用的参数很明显

create(tab);

是一个二维数组。

你可以像这样声明函数

void create(int tabes[][N]){
    //...
}

如您所见,参数有一个二维数组。但是编译器将参数调整为指向数组元素类型的指针。数组tab的元素类型声明为

int tab[N][N];

int[N]。所以指向数组元素的指针类型看起来像int ( * )[N]。此类型在您的函数声明中使用。

就是这些函数声明

void create(int tabes[N][N]);
void create(int tabes[][N]);
void create(int ( *tabes )[N]);

声明同一个函数,因为据说编译器会将具有数组类型的参数调整为具有指向数组元素类型的指针类型的参数。

因此该函数处理指向int[N] 类型数组的指针。

另一方面,用作函数调用参数的数组选项卡被隐式转换为指向其第一个元素的指针。同样,此指针的类型为 int ( * )[N]

其实这个调用

create(tab);

相当于下面的调用

int ( *ptr )[N] = tab;
create( ptr );

除了在最后一种情况下使用了一个辅助变量ptr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 2020-08-24
    • 2016-01-24
    • 2016-05-11
    • 2021-02-24
    相关资源
    最近更新 更多