堆上的 C++ 数组声明?

Posted

技术标签:

【中文标题】堆上的 C++ 数组声明?【英文标题】:C++ array declaration on heap? 【发布时间】:2021-07-07 22:43:15 【问题描述】:

在 C++ 中我们可以这样写:

    int arr[] = 20,3,2,0,-10,-7,7,0,1,22;
//Smal Note: Why int *arr = 20,3,2,0,-10,-7,7,0,1,22; won't work? I learnt I can replace [] with *

但是如果我想在一行中在堆上分配 arr 怎么办?

我试过了:

    int arr[] = new int 20,3,2,0,-10,-7,7,0,1,22;

【问题讨论】:

int *arr = new int[]...;. "我知道我可以用 * 替换 []" 这应该是关于函数参数的。 你还有更受欢迎的std::vector<int> 【参考方案1】:

函数参数中,int[] 表示“一个未知大小的数组”,在技术上等同于int*。 (当指针被解释为指向数组中第一个整数的指针时)。

但在您的声明中,int[] 的意思是“一个大小由初始化程序确定的数组”,这是一个众所周知的大小。

new int[] 确实在堆上创建了一个数组,但它返回一个指向第一个元素的指针。您可能会注意到这里与函数参数的相似之处 - 从数组转换为指针很容易。

std::vector<int> 也在堆上创建一个数组,但是管理数组的向量对象可以存在于任何地方。这通常更方便。

【讨论】:

【参考方案2】:

如果你写int arr[] = 20,3,2,0,-10,-7,7,0,1,22;,你的arr通常存储在堆栈中,就像int a=20, b=3, ...;一样。在这种情况下,右侧是一个初始化器,它只是告诉int arr[] 是如何初始化的。

另一方面,如果你写int *arr = new int[]20,3,2,0,-10,-7,7,0,1,22;,则数组是在堆上创建的,只能通过指针访问,指向数组的指针分配给int *arr,而int *arr又在堆栈上.

所以在声明的上下文中,int[]int* 是完全不同的东西。但是int[] 数组和int* 数组都可以使用[] 运算符来访问,例如arr[2]*(arr+2) 同义。而当你使用int[]int* 作为函数的参数时,它们是完全可以互换的。

【讨论】:

以上是关于堆上的 C++ 数组声明?的主要内容,如果未能解决你的问题,请参考以下文章

c ++ - 使用存储在堆上的数组填充对称矩阵

堆上的 C++ 多维数组

在 Java 中不使用“new”关键字声明数组

使用堆栈空间的 Java 数组

在 C++ 中存储大矩阵(犰狳)

在 C++ 中初始化对象之前声明一个对象