c ++动态数组初始化与声明

时间:2013-07-10 09:10:22

标签: c++ dynamic-arrays

我的功能如下:

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

并在 main 函数中创建2d动态数组以传递此函数

    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个小时搞清楚

4 个答案:

答案 0 :(得分: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变量是动态的,它已被编译器完全声明和初始化,没有任何动态。

答案 1 :(得分:2)

从技术上讲,2D阵列是一维阵列的数组。所以它无法转换为指向的指针。但它可以转换为指向数组的指针

所以这应该有效:

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

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

希望有所帮助。

答案 2 :(得分: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);

答案 3 :(得分: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

工作