我正在尝试将2d数组传递给函数,但编译器显示错误:
错误:无法将参数int (*)[5]
的{{1}}转换为int**
至1
我知道这个理论,但却无法弄清楚它为什么不起作用。
int max_size(int**, int, int)
答案 0 :(得分:5)
您正在尝试将2D数组作为int**
类型的参数传递。这种转换是不可能的,因为它们将具有根本不同的结构。
2D数组(例如3x3)在内存中看起来像这样:
0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│ int │ int │ int │ int │ int │ int │ int │ int │ int │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
int**
当用作一种2D数组(其中最外面的指针指向指针数组中的第一个元素,并且每个指向一个int数组中的第一个元素)看起来像这样:
┌─────┐
│ │ // The int**
└──╂──┘
┃
▼
┌─────┬─────┬┄
│ │ │ // An array of int*
└──╂──┴──╂──┴┄
┃ ┗━━━━━━━━━━┓
▼ ▼
┌─────┬─────┬┄ ┌─────┬─────┬┄
│ int │ int │ │ int │ int │ // Arrays of ints
└─────┴─────┴┄ └─────┴─────┴┄
0,0 0,1 1,0 1,1
但是,int[x][y]
类型的2D数组可转换为类型int(*)[y]
(这通常称为数组到指针转换),因此您可以像这样编写函数:
int max_size(int (*g)[c],int m,int n);
这可以用一些语法糖来写,如:
int max_size(int g[][c],int m,int n);
数组类型的参数(像这一个)被转换为指针 - 也就是说,[]
根本就不会说“数组”。实际上,您可以在这些括号中放置一个大小,但它将被完全忽略。
答案 1 :(得分:1)
我很确定你必须在函数声明和初始化中声明数组的大小。
int max_size(int *g[]
应该是int max_size(int *g[5]
或者数组大小应该是什么。
答案 2 :(得分:1)
更改
int max_size(int *g[],int m,int n)
要
int max_size(int g[][c],int m,int n)
答案 3 :(得分:0)
int a[6][5];
定义了一个支持步长的语法的单个内存数组。
int * a[]
和int ** a
不提供步幅(或行或列大小,具体取决于您想要的方式)并定义指向其他内存的指针数组,而不是像int a[6][5];
那样的单个内存块。
答案 4 :(得分:0)
有一些方法可以做到这一点
1)当第二维全局可用时(作为宏或作为全局常量)。
int max_size(int g[][c],int m,int n)
2)使用单个指针
void max_size(int *g, int m, int n) and call it as
max_size((int *)m,r,c)
3)使用指针数组或双指针
void max_size(int *g[], int m, int n) and call it as
max_size((int **)m,r,c)
它们中的任何一个都可以工作。它就是你想要的方式。