【问题标题】:C++ How to declare pointer to 2D array [duplicate]C ++如何声明指向二维数组的指针[重复]
【发布时间】:2014-01-31 19:11:19
【问题描述】:

我有一部分代码是这样的(假设所有类型都是int):

for(int i = 0; i < h; ++i)
{
    for(int i = 0; i < h; ++i)
    {
        if(...)
        {
             a = B[i][j]
        }
        else
        {
             a = C[i][j]
        }
    }
}

我想写它以便我只检查一次if 条件。但是我将如何充分声明指向 2D 数组的指针(下例中的变量 D)?

if(...)
{
    D = B;
}
else
{
    D = C;
}

for(int i = 0; i < h; ++i)
{
    for(int i = 0; i < h; ++i)
    {
        a = D[i][j]
    }
}

【问题讨论】:

  • 避免二维数组。考虑一维数组要简单得多。
  • 假设我现在不能:P
  • 对于一维:int(*p)[10];,对于二维:int(*p)[r][c]
  • @BasileStarynkevitch 多么奇怪的建议。二维数组有什么难的?如果二维数组很好地模拟了问题,请使用二维数组。
  • @JohnKugelman 对于内存布局和语法之间的一切,语义二维数组(如锯齿状数组)和 C++ 二维数组概念之间存在很大差异。通常,C++ 2D 数组语法令人讨厌且不直观,大小恒定,并且与锯齿状数组相比几乎没有(如果有的话)性能提升。它们具有通过值传递和通过引用传递的奇怪特征......所以通常最好避免它们,恕我直言。

标签: c++ pointers multidimensional-array


【解决方案1】:

结合@MadScienceDreams 的回答和@Grijesh Chauhan 的评论,以下似乎可行:

double A[1000][1000];
double (*B)[1000][1000] = &A;

然后访问一个值:

double a = (*B)[i][j];

【讨论】:

  • 我打算发布一个答案,但你的答案涵盖了大部分内容。一个例子可以在here找到。
  • 奇怪,我仍然不知道为什么double (&amp;B)[1000][1000] = A; 不起作用:-P
  • + 用于自学,顺便说一句,你也可以这样:double **B = A; 然后double a = B[i][j]; 看起来更简单。
  • 在发帖之前我已经想到了 double**,但是我在 VS 中得到了这个 --> Error: a value of type "double (*)[1000]" cannot be used to initialize an entity of type "double **"
  • @GrijeshChauhan 不,他们不会工作。这仅适用于锯齿状数组,使用 C++ 2D 数组执行此操作会导致段错误
【解决方案2】:
  const int w = 10;
  const int h = 10;

  char b[w][h];
  char c[w][h];
  char (&d)[w][h] = b;

  assert(&b[0][0]==&d[0][0]);

(这是假设您使用的是二维数组,而不是(更好,恕我直言)锯齿状数组)。

【讨论】:

  • 你的回答似乎很有希望,但我明白了:error C2440: 'initializing' : cannot convert from 'double (*)[1000]' to 'double (&amp;)[1000][1000]'
  • @Smash hmmm...它在 g++ 下编译得很好。你是如何初始化你的数组的?这看起来像您正在使用一个交错的静态数组数组......
  • 初始二维数组是在标题double[1000][1000] A 中声明的类成员变量。然后在一个成员函数中我尝试做double (&amp;B)[1000][1000] = A;
  • @Smash double[1000][1000] 语法无效....
  • 嗯...对不起我的意思是double A[1000][1000]; ...
【解决方案3】:

您可以随意声明数组,
只要函数原型与数组声明匹配

C++ 甚至不应该允许这样的不匹配,但由于某些原因,它做的事情与 C 完全一样。

更多详情请见this answer

【讨论】:

    【解决方案4】:

    大家好

    但是上面的其他人给出了你的答案,但结果代码在下面
    int B[w][h];
    int C[w][h];
    int (&D)[w][h] = (any clause) ? B : C;
    for(int i =0;i < w;i++)
    for(int j =0;j < h;j++)
    a = D[i][j];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2017-06-11
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多