【问题标题】:how to convert int[][] to int** in C++ [duplicate]如何在 C++ 中将 int[][] 转换为 int** [重复]
【发布时间】:2014-08-29 11:55:42
【问题描述】:

有没有一种简单的方法可以将int[n][n] 类型的实例转换为int**? 比如代码

void foo(int** arr) {
// ...
}
int X[10][10];
memset(X,0,10*10*sizeof(int));
foo(X); // error: cannot initialize a parameter of type 'int **' with an lvalue of type 'int [10][10]'

当然,一个简单的解决方法是拥有

int** X=new int*[10];
for (int i=0;i<10;++i) X[i]=new int[10];

但这在某种程度上反驳了在 C++ 中数组只是指针(一维数组当然是指针)的想法。

【问题讨论】:

  • 目前函数“foo”无法知道数组是 10x10 - 我想这没问题?
  • int[100]int[10][10] 不是一回事。
  • 这对您有帮助吗? stackoverflow.com/questions/1584100/…
  • C++ arrays 不是指针!
  • the idea that in C++ arrays are just pointers 嗯?你从哪里得到那个的?错了。

标签: c++ pointers


【解决方案1】:

不。底层的 int[N][M] 是一个连续的内存块(其中额外的维度被展平),其中包含一些语法糖,以使编译器进行数学运算以访问元素。

int **(实际上是int *[N])是完全不同的野兽,因为它使用了一个额外的间接方法,允许每一行驻留在其他地方;哎呀,您甚至可能有 NULL 行或不同长度的行。

OTOH 如果您有一个“真正的”多维数组并且需要一个int **,您可以通过仅创建“指针索引”并使其指向原始数组内部来弥补差距。

int *a[10];
for(int i=0; i<10; ++i) 
    a[i]=arr[i];

【讨论】:

    猜你喜欢
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2013-04-18
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多