2016-03-01 41 views
0

我拥有类格拉夫构造:[n]和INT **

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++,我认为这些类型兼容。你能否描述我的区别?

编辑: 因为这个问题被标记为重复的,我也想问,什么是这些类型中的一种转换成另一种最好的方式,或者改用什么没有任何性能损失

+5

见http://stackoverflow.com/questions/14183546/why-does-int-decay-into-int-but-not-int – Michael

+0

谢谢你,我现在理解上的差异。但是,我没有找到方法,如何将一个转换为另一个。 –

+0

你想在这里做什么看起来危险和复杂。我可以看到有人将一个指向本地对象的指针传入构造函数中的未定义行为。帮你一个忙,并在Graph中使用'std :: vector'。 –

回答

2

int [3][3]在极少数例外情况下(例如用于sizeof运算符时)转换为int (*)[3]

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 *类型的对象。

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

0

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

AFIK。你可以这样做:

void myfunc(int myarray[][3]); 
相关问题