繁体   English   中英

int ** p是什么意思?

[英]What does int **p in mean?

我知道我们在需要给动态内存中的指针数组提供指针时会用到它,但是我不明白的是它在堆栈中的工作方式。

这是否也使堆栈中的指针数组也指向堆中的指针数组,还是使堆栈中的单个指针指向堆中的指针数组? 如果是,那么两者之间有什么区别

int **p = new int*[100]

int *p = new int[100]

提前致谢。 我已经很长时间了试图理解这一点,并且已经在线阅读了很多文档,但是我还是不明白。

int **p在堆栈上声明一个指针,该指针指向堆上的指针。 每个指针都指向堆上的一个整数或整数数组。

这个:

int **p = new int*[100];

表示您在堆栈上声明了一个指针并对其进行了初始化,以使其指向堆上包含100个指针的数组。 目前,这100个指针中的每一个都指向无处。 “无处”是指它们既不指向有效的内存块,也不是nullptr 它们没有被初始化,因此它们包含一些在分配指针之前在内存中的垃圾值。 您应该在使用前循环分配一些有意义的东西给他们。 需要注意的是p[0] - p[99]指针不能保证,如果你指定的返回值指向的内存相邻区域new给他们。 例如,如果您为每个内存分配内存,则p[i] = new int[200]; p[0][201]不会引用p[1][2] ,但是会导致未定义的行为。

和这个:

int *p = new int[100];

是堆栈上的一个指针,指向堆上100个整数的数组。

不用担心,C语言中的指针和数组总是引起混乱。 通常,声明一个类型为int的数组时,会创建一个int类型的指针,该指针指向将存储int的连续内存块中的第一个元素。 例如,如果我有一个简单的使用int *p_to_intarr = new int[3]数组, int *p_to_intarr = new int[3]得到以下信息:

+++++++  <--------- p_to_intarr
| int |
+++++++
| int |
+++++++
| int |
+++++++

通常,如果我想要一个类型T的数组,则创建一个指向类型T的指针,例如T *ptr_to_Tarr = new T[3]

那么,如果我想要一个整数数组怎么办? 让我们用一个“整数数组”的类型替换T in,这将给我们一个“整数数组”的数组。 好吧,我们只是在第一个示例中说过int *中的int *数组的类型,因此int *的数组的数组将是: int* *ptr_to_arrayofintarr = new int*[3] 请注意,我们只是将T替换为int星型。 这通常写得更整洁,如int **ptr_to_arrayofintarr = new int*[3]

因此int **p可以是指向2d数组的指针。 它也可以是对一维数组的引用。 取决于具体情况:)

new表达式的计算结果为某种类型的指针, 指向已在免费存储区(实际上是堆)中分配但不一定免费存储区中分配的内存。 (根据上下文,它仍然可以位于免费存储区中;例如,考虑在构造函数中的初始化列表,用于在免费存储区中分配的对象。)

new初始化的对象当然在免费商店中。

在还有你的赋值语句,您可以看到返回的指针类型new上等号的左边,而自由存储对象(S)到右边的类型new 因此,在第一种情况下,本地评估的唯一对象(即可能在堆栈上)是指向int的指针,而在第二种情况下,则是指向int的指针。 自由空间中的对象在第一种情况下是一个指向int的指针的数组,在第二种情况下是一个简单的int的数组。

注意,仅仅因为第一个赋值中的数组由指针组成,并不意味着指针本身实际上已经指向任何东西; new不会神奇地递归为它创建的数组中的任何指针所针对的对象分配可用空间。 (反正这没有多大意义。)

**表示您有一个指向指针的指针。 实际上,这意味着您拥有一个二维数组。

由于数组的每个元素也是一个指针,因此您还需要初始化这些指针:

for (int i = 0; i < 100; ++i)
    p[i] = new int[200];

这将初始化一个100x200的数组。 您可以使用p[99][199]访问右下角。

是时候删除指针了,您必须逆转该过程:

for (int i = 0; i < 100; ++i)
    delete [] p[i];
delete [] p;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM