【问题标题】:c++ dynamic array initialization with declarationc++ 动态数组初始化与声明
【发布时间】:2013-07-10 09:10:22
【问题描述】:

我有这样的功能:

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

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

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

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

附言抱歉,如果这是重复的问题,但我已经花了 1.5 个小时弄清楚了

【问题讨论】:

  • 数组不是指针。您正在将一个指针(衰减后)传递给一个需要指向指针的指针的数组。
  • 试试:bool matrix[6][7]bool matrix[][7]bool (*matrix)[7]
  • 或者直接使用std::array:std::array<std::array<bool, 6>, 7>。另外,这不是动态数组。

标签: c++ dynamic-arrays


【解决方案1】:

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

你的矩阵是这样的:

[矩阵[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 变量不是动态的,它由编译器完全声明和初始化,没有任何动态。

【讨论】:

    【解决方案2】:

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

    所以这应该有效:

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

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

    希望对您有所帮助。

    【讨论】:

    • 您必须在函数findScaf1() 中添加,他可以访问元素(*matrix)[i][j]matrix[i][j] 会出错,否则我确定OP 会出错。
    • @GrijeshChauhan,怎么会出错?这就是它在正常索引时衰减到的样子。
    • @GrijeshChauhan:matrix[i][j] 是绝对正确的语法。事实上,(*matrix)[i][j] 是错误的!!!
    • @chris , Nawaz 我错了,你们俩都是对的 :),但让我保持这条评论不被删除可能会有所帮助
    • @GrijeshChauhan:是的,不要删除它。对于程序员来说,了解不该做什么是很重要的。 :-)
    【解决方案3】:

    您可以将函数定义为:

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

    【讨论】:

      【解决方案4】:

      我下面的例子可能对你有帮助:

      #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工作

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-01
        • 1970-01-01
        • 2021-04-15
        • 1970-01-01
        • 1970-01-01
        • 2020-10-31
        • 2017-11-20
        相关资源
        最近更新 更多