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

What is int (*tabes)[N]?

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);
}

Dynamic array allocation with pointer only

对于初学者来说,您问题中提供的代码中没有动态数组分配。所以题名比较乱

这个数组的声明中你忘了放置分号

int tab[N][N]

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

将标题更改为

What is int (*tabes)[N]?

然后简而言之,它是一个名称为 tabes 的指针的声明,它指向数组类型 int[N] 的 object。

2 Question - Why is the argument of a function a one-dimensial array when we pass a two-dimensial array

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

create(tab);

是一个two-dimensional数组。

你可以像这样声明函数

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

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

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