微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

堆上的 C++ 数组声明?

如何解决堆上的 C++ 数组声明?

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

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

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

我试过了:

    int arr[] = new int {20,22};

解决方法

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

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

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

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

,

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

另一方面,如果你写int *arr = new int[]{20,22};,数组是在堆上创建的,只能通过指针访问,指向数组的指针被赋值给int *arr,然后在堆栈上。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。