2016-09-08 120 views
1

我对C++程序中的这一行感到困惑。该程序的想法是检查4x4阵列是否是对称的。这部分代码声明了一个2D数组,我不明白。使用双指针声明2D数组

int** array = new int*[n]; 

虽然,还有另一个类似于这个问题,但它是关于我得到的单个指针。

int *array = new int[n]; 

我不明白双指针。请解释一下。

+0

这样想:第一个是分配一系列'n'指针,然后每个指针可以分配类似于第二行的东西,你已经明白了。然后通过'array [i]'访问数据的第i行“行”。但那只是一个'int *'。因此,您可以通过'array [i] [j]'访问数据的*第*列“数据”。 – WhozCraig

回答

3

如何创建单个指针数组?你这样做:

int* myArray = new int[n]; 

这是什么意思?它有两个部分。第一部分是保留一个指针int*我们称之为myArray,第二部分是你保留n元素,每个元素在内存中的大小为int(这是一个数组,对吗?),然后你获取该数组的地址并保存它在变量myArray中。

现在你想要一个二维数组,它是一个数组的数组。所以这个新数组阵列中的每个元素就是其中之一,我们在那里讨论过。我们如何保留这个?我们这样做:

new int*[n]; 

因为我们是保留n插槽,每个int*类型,我们之前谈到。

现在什么是返回值的类型?这是一个数组的数组,或“指向数组的指针,而后者也是一个指向数组的指针”,所以你把它写成

(int*)* 

或者

int** 

因此它成为

int** array = new int*[n]; 
+0

“...一个二维数组,它是一个数组的数组” - 该语句是准确的。但是,OP的混淆不需要通过将* array *数组与*指针*数组混淆而进一步加剧。他们**不是**的同义词。后者让句法糖看起来像前者,但它们绝不相同。我希望OP能够抓住这个问题,否则他们会回过头来发表另外一个关于为什么要传递'a',声明为'int a [n] [m];'来期待'int ** ar'不起作用的问题。 – WhozCraig

+0

@WhozCraig我喜欢让事情系统化地理解。那是我在那里试图做的。 –

+0

@ TheQuantumPhysicist你的解释真的很有帮助。非常感谢。 – TheLearner

1

int** array是一个指向的指针int。因此,通过这样做:

int** array = new int*[n]; 

要创建的保存nint*指针部分内存,并在内存指着array。对于每一个你已经创建了这些指针,就可以像这样创建一组int S:

for (auto i = 0; i < n; ++i) 
    array[i] = new int[n]; 

产生的内存将是这样的:

array -> [  int*  |  int *  | .... n 
     [int | int | ...][int | int | ...][ ... n 

然而,这是多少如果你使用一些std东西在C++中容易得多,即std::vector

std::vector<std::vector<int>> arr(std::vector<int>(0, n), n); 

和你做......

+0

很好解释。感谢您的帮助。 – TheLearner