在C ++中将2d数组作为函数参数传递出错

时间:2015-01-01 14:52:20

标签: c++ arrays function 2d

我正在尝试将2d数组传递给函数,但编译器显示错误:

错误:无法将参数int (*)[5]的{​​{1}}转换为int**1

我知道这个理论,但却无法弄清楚它为什么不起作用。

int max_size(int**, int, int)

5 个答案:

答案 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)

它们中的任何一个都可以工作。它就是你想要的方式。