微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决什么是 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);
}

解决方法

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

对于初学者,您的问题中提供的代码中没有动态数组分配。所以问题的标题令人困惑。

这个数组的声明,你忘记放分号了

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。