6

我有这样的功能:

void findScarf1(bool ** matrix, int m, int n, int radius, int connectivity); 

函数中,我创建了二维动态数组来传递这个函数

    bool matrix[6][7] = {
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 1, 1, 0, 0}
};

问题是:

findScarf1(matrix, 6, 7, 3, 4);

导致 错误 C2664:“findScarf1”:无法将参数 1 从“bool [6][7]”转换为“bool **”

如何紧凑地初始化数组(与声明同时)?

ps 抱歉,如果它是重复的问题,但我花了 1.5 个小时才弄清楚

4

4 回答 4

3

如果您查看数组在内存中的布局,并比较指针到指针“矩阵”的布局,您就会明白为什么不能将矩阵作为指针传递。

你的矩阵是这样的:

[矩阵[0][0] | 矩阵[0][1] | ... | 矩阵[0][6] | 矩阵[1][0] | 矩阵[1][1] | ... ]

指针对指针的矩阵是这样的:

[矩阵[0] | 矩阵[1] | ... ]
  | |
  | v
  | [矩阵[1][0] | 矩阵[1][1] | ... ]
  v
  [矩阵[0][0] | 矩阵[0][1] | ... ]

您可以通过更改函数参数来解决此问题:

bool (*matrix)[7]

这使参数matrix成为指向数组的指针,这将起作用。


顺便说一句,matrix您拥有的变量不是动态的,它是由编译器完全声明和初始化的,它没有任何动态。

于 2013-07-10T09:16:30.443 回答
2

从技术上讲,二维数组是一维数组的数组。所以它不能转换成指向指针的指针。不过,它可以转换为指向数组的指针。

所以这应该工作:

void findScarf1(bool (*matrix)[7], int m, int n, int radius, int connectivity); 

这里bool (*matrix)[7]声明了一个指向 7 bool 数组的指针

希望有帮助。

于 2013-07-10T09:15:50.637 回答
1

我的以下示例可能对您有所帮助:

#include<stdio.h>
void f(int (*m)[7]){  // As Nawaz answred
 printf("%d\n", m[3][3]);

}
void _f(int m[6][7]){ // As I commented to your question
 printf("%d\n", m[3][3]);

}
void _f_(int m[][7]){// Second form of Nawaz's answe 
 printf("%d\n", m[3][3]);

}
void f_(int (*m)[6][7]){// Pointer of 2D array
 printf("%d\n", (*m)[3][3]);
}

int main(){

    int matrix[6][7] = {
    {0, 0, 1, 1, 1, 0, 0},
    {0, 0, 1, 3, 1, 0, 0},
    {0, 0, 1, 4, 1, 0, 0},
    {0, 0, 1, 5, 1, 0, 0},
    {0, 0, 1, 6, 1, 0, 0},
    {0, 0, 1, 7, 1, 0, 0}
    };
    f(matrix);
    _f(matrix);
    _f_(matrix);    
    f_(&matrix);
    return 1;
}    

问题与c无关,但我用gcc编译(我没有安装g ++)。

~$ gcc  -Wall -pedantic 2d.c
~$ ./a.out 
5
5
5
5

我不打算发布答案,但因为我对 Nawaz 的答案发表了错误的评论,所以在实验期间我编写了这段代码。

在这里可以找到它在codepacde工作

于 2013-07-10T09:57:27.380 回答
1

您可以将函数定义为:

void findScarf1(bool * matrix, int m, int n, int radius, int connectivity);

或者

void findScarf1(bool matrix[][7], int m, int n, int radius, int connectivity);

不管一个数组有多少维,它只是一块线性内存。

当您使用第一种方式时,您可能需要在调用此函数时进行强制转换:

findScarf1((bool *)marix, 6, 7, 3, 4);
于 2013-07-10T09:12:18.050 回答