【问题标题】:Relationship between int[n][n] and int** [duplicate]int[n][n] 和 int** 之间的关系 [重复]
【发布时间】:2016-03-01 21:20:58
【问题描述】:

我的类 Graph 有一个构造函数:

template <typename T>
Graph<T>::Graph(T ** input)
{
    graphData = input;
}

当我尝试使用二维数组而不是 int** 来创建此类的新实例时

int intArray[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
Graph<int>* IntGraph = new Graph<int>(intArray);

我有一个错误cannot convert parameter 1 from 'int [3][3]' to 'int **

我是 C++ 新手,我认为这些类型是兼容的。你能描述一下区别吗?

编辑: 由于这个问题被标记为重复,我还想问,将其中一种类型转换为另一种类型的最佳方法是什么,或者在不损失任何性能的情况下使用什么来代替

【问题讨论】:

  • 谢谢,现在我明白了其中的区别。但是,我没有找到方法,如何将一个转换为另一个。
  • 您在这里尝试做的事情看起来既危险又复杂。我可以看到来自将指向本地对象的指针传递给构造函数的未定义行为。帮自己一个忙,在Graph 中使用std::vector
  • 保留问题是附加第二个问题的特别糟糕的地方。您可能想提出一个新问题。
  • 我很乐意,但系统不允许我再问 3 天的问题。我正在尽最大努力以正确的方式提出问题,但正如我所见,这台服务器对初学者不友好。

标签: c++ pointers multidimensional-array type-conversion


【解决方案1】:

int [3][3] 在表达式中被转换为int ( * )[3],但很少有例外(例如在 sizeof 运算符中使用时)。

int ( * )[3] 是指向int[3] 类型数组的指针,而int ** 是指向int * 类型对象的指针

考虑以下示例

int a[3][3];
int ( *pa )[3] = a;

int * b[3];
int **pb = b;

或者你可以写的最后一个声明

int * ( *pb ) = b;

在这个例子中,指针pa被初始化为二维数组a的第一个元素的地址。二维数组的元素是一维数组。

指针pb 也由数组b 的第一个元素的地址初始化。数组的元素是 int * 类型的对象。

您不能将其中一种类型转换为另一种。

【讨论】:

    【解决方案2】:

    您不能将 int[][] 转换为 int**,因为 int[][] 在大小为 2*3 的情况下是连续的内存块,而 int** 需要一个指向 int 指针的指针。

    AFIK。你可以这样做:

    void myfunc(int myarray[][3]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-02
      • 2016-05-30
      • 2021-02-24
      • 1970-01-01
      • 2015-09-02
      • 2012-12-08
      • 2020-07-15
      • 1970-01-01
      相关资源
      最近更新 更多