int [n] [n]和int **之间的关系

时间:2016-03-01 21:20:58

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

我的类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 ++的新手,我认为这些类型是兼容的。你能告诉我差异吗?

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

2 个答案:

答案 0 :(得分: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 *类型的对象。

您无法将其中一种转换为另一种类型。

答案 1 :(得分:0)

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

AFIK。你可以这样做:

<section>
<div class="container">
                <div class="gallery-flex">
                    <div class="owner-pic">
                        <h2>Meet The Director</h2>
                        <img src="images/gallery/me4.jpg" alt="#">
                        <p>Some text and shit more text and shit</p>
                    </div>
                    <h2>Here are some photos of the cars we have cleaned.</h2>
                    <div class="pic1">
                        <img src="images/gallery/cleaning-car01.png" alt="#">
                    </div>
                    <div class="pic2">
                        <img src="images/gallery/cleaning-car02.jpg" alt="#">
                    </div>
                    <div class="pic3">
                        <img src="images/gallery/cleaning-car03.jpg" alt="#">
                    </div>
                    <div class="pic4">
                        <img src="images/gallery/cleaning-car04.jpg" alt="#">
                    </div>
                    <div class="pic5">
                        <img src="images/gallery/cleaning-car05.jpg" alt="#">
                    </div>
</div> <!--section-flex!-->
</div><!--container!-->
</section>