【问题标题】:2D array to pointers [duplicate]指向指针的二维数组[重复]
【发布时间】:2013-03-12 13:37:04
【问题描述】:

我有数组:int i[20][30]。让int**指针在上面使用的最快方法是什么?

我的朋友刚刚写了一个使用相同大小数组的函数,而我的函数是指针,我需要传递他的数据。

【问题讨论】:

  • 最快的方法是不要。无论如何,为什么不直接使用std::array
  • 添加函数原型
  • 二维数组的内存布局与指向指针的指针所期望的不同。

标签: c++ pointers multidimensional-array


【解决方案1】:
int a[20][30];       // data as 2D array
int *ap[20];         // array of pointers
for (j = 0; j < 20; ++j)
    ap[j] = a[j];    // convert array to pointers
// can now pass `ap` to function expecting `int **`...

【讨论】:

  • @Daniel:谢谢 - 使用 i 作为数组名称让我的大脑混乱了 - 现在已修复。
  • 为什么有人会否决这个答案?有没有人有更好的主意来制作一个期望 int**int[20][30] 的函数?
  • 没有更快的方法吗?
  • @oneat 您要求在两个不兼容的事物之间进行转换。这种转换需要一些努力。
  • 我现在更改了上面的数组/指针名称,因为它有些混乱。
【解决方案2】:

您不能将 int i[20][30] 更改为 int **,除非手动检查数据并构建它。
但是,可能对您有所帮助的是,c++ 中的每个 xD 数组都只是一个 1D 数组,具有某种复杂的访问成员的方式。

例子:

#define MaxX 20
#define MaxY 30
int i[MaxX][MaxY];
...
//When you write:
i[x][y] = something;
//It's actually been translate to:
i[x * MaxY + y] = something;

【讨论】:

    【解决方案3】:

    您不能将int ** 指针直接指向该数组,这没有任何意义。如果您想将数组作为内存块访问,您可以使用:

    int *p = (int *)i; // you can go to up (p + 20*30)
    

    否则你需要一个指向int[30]数组的指针,即

    int (*p)[30] = &i[0]; // points to first row
    

    对于第一个,由于演员表,您可以定义:

    int **p2 = &p;
    

    您可以使用*(*p2 + n) 访问该数组。您已经抛弃了数组维度,但只要您在指针计算中使用它们,它们都是有效的,即*(*p2 + 35) 指的是第 2 行第 6 列(一行 30,加上下一个元素 5)。这非常快,但是如果函数需要使用原始维度对数组进行操作,这将不起作用(因为它不是指针数组)。

    【讨论】:

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