int \*\*p in 是什么意思?

新手上路,请多包涵

我知道当我们需要为动态内存中的指针数组提供一个指针时我们会使用它,但我不明白它是如何在堆栈中工作的。

这是否也会在堆栈中创建一个指针数组,指向堆中的指针数组,还是在堆栈中创建一个指向堆中指针数组的指针?如果是,那么有什么区别

int **p = new int*[100]

int *p = new int[100]

提前致谢。我一直在努力理解这一点,并且在网上阅读了很多文档,但我仍然不明白这一点。

原文由 Shank 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 511
1 个回答

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

这个:

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

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

和这个:

 int *p = new int[100];

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

原文由 Sergey 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题