我对C++程序中的这一行感到困惑。该程序的想法是检查4x4
阵列是否是对称的。这部分代码声明了一个2D数组,我不明白。使用双指针声明2D数组
int** array = new int*[n];
虽然,还有另一个类似于这个问题,但它是关于我得到的单个指针。
int *array = new int[n];
我不明白双指针。请解释一下。
我对C++程序中的这一行感到困惑。该程序的想法是检查4x4
阵列是否是对称的。这部分代码声明了一个2D数组,我不明白。使用双指针声明2D数组
int** array = new int*[n];
虽然,还有另一个类似于这个问题,但它是关于我得到的单个指针。
int *array = new int[n];
我不明白双指针。请解释一下。
如何创建单个指针数组?你这样做:
int* myArray = new int[n];
这是什么意思?它有两个部分。第一部分是保留一个指针int*
我们称之为myArray
,第二部分是你保留n
元素,每个元素在内存中的大小为int
(这是一个数组,对吗?),然后你获取该数组的地址并保存它在变量myArray
中。
现在你想要一个二维数组,它是一个数组的数组。所以这个新数组阵列中的每个元素就是其中之一,我们在那里讨论过。我们如何保留这个?我们这样做:
new int*[n];
因为我们是保留n
插槽,每个int*
类型,我们之前谈到。
现在什么是返回值的类型?这是一个数组的数组,或“指向数组的指针,而后者也是一个指向数组的指针”,所以你把它写成
(int*)*
或者
int**
因此它成为
int** array = new int*[n];
“...一个二维数组,它是一个数组的数组” - 该语句是准确的。但是,OP的混淆不需要通过将* array *数组与*指针*数组混淆而进一步加剧。他们**不是**的同义词。后者让句法糖看起来像前者,但它们绝不相同。我希望OP能够抓住这个问题,否则他们会回过头来发表另外一个关于为什么要传递'a',声明为'int a [n] [m];'来期待'int ** ar'不起作用的问题。 – WhozCraig
@WhozCraig我喜欢让事情系统化地理解。那是我在那里试图做的。 –
@ TheQuantumPhysicist你的解释真的很有帮助。非常感谢。 – TheLearner
int** array
是一个指向的指针int
。因此,通过这样做:
int** array = new int*[n];
要创建的保存n
int*
指针部分内存,并在内存指着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);
和你做......
很好解释。感谢您的帮助。 – TheLearner
这样想:第一个是分配一系列'n'指针,然后每个指针可以分配类似于第二行的东西,你已经明白了。然后通过'array [i]'访问数据的第i行“行”。但那只是一个'int *'。因此,您可以通过'array [i] [j]'访问数据的*第*列“数据”。 – WhozCraig