C++动态数组初始化声明

6

I have function like this:

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

主函数(main)中,我创建了一个二维动态数组来传递给这个函数。

    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 **”

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

p.s. 如果这是重复的问题,对不起,我花了 1.5 小时找出来。


1
数组不是指针。你正在传递一个指向数组的指针(经过衰减后),而期望的是一个指向指针的指针。 - chris
2
https://dev59.com/9moy5IYBdhLWcg3wHaXt#8767247 - bennofs
尝试使用以下代码:bool matrix[6][7]bool matrix[][7]bool (*matrix)[7] - Grijesh Chauhan
可能是将2D数组传递给函数的重复问题。 - Daniel Daranas
或者直接使用std::arraystd::array<std::array<bool, 6>, 7>。此外,这不是一个动态数组。 - chris
4个回答

3
如果你查看数组在内存中的布局,并将其与指向指针的“矩阵”布局进行比较,你就会明白为什么不能将矩阵作为指向指针的指针传递。
你的矩阵是这样的:
[ matrix[0][0] | matrix[0][1] | ... | matrix[0][6] | matrix[1][0] | matrix[1][1] | ... ]
指向指针的矩阵如下所示:
[ matrix[0] | matrix[1] | ... ] | | | v | [ matrix[1][0] | matrix[1][1] | ... ] v [ matrix[0][0] | matrix[0][1] | ... ]
你可以通过更改函数参数来解决这个问题:
bool (*matrix)[7]

这使得参数matrix成为指向数组的指针,这样就可以使用了。


顺便提一下,你拥有的matrix变量并不是动态的,它完全由编译器声明和初始化,没有任何动态性可言。


2

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

因此这个应该可以工作:

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

这里的bool (*matrix)[7]声明了一个指向包含7个bool元素的数组的指针。希望对你有所帮助。

1
你必须在函数 findScaf1() 中添加这个内容,他可以访问元素 (*matrix)[i][j],而 matrix[i][j] 是错误的,否则原始问题可能会出错。 - Grijesh Chauhan
1
@GrijeshChauhan,怎么可能错呢?这就是正常索引时它所代表的。 - chris
2
@GrijeshChauhan:matrix[i][j]是绝对正确的语法。事实上,(*matrix)[i][j]是错误的!!! - Nawaz
@chris,Nawaz,我错了,你们两个都是正确的:),但让我保留这个评论未删除,也许会对某些人有帮助。 - Grijesh Chauhan
1
@GrijeshChauhan:是的,不要删除它。对于程序员来说,学习什么是不应该做的很重要。 :-) - Nawaz

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

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可以找到它的工作原理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接