【问题标题】:c++ dynamic array of pointers [duplicate]c ++动态指针数组[重复]
【发布时间】:2018-06-04 03:22:20
【问题描述】:

我试图了解如何在 C++ 中创建一个动态指针数组。 我知道new 返回一个指向已分配内存块的指针,int*[10] 是一个指向int 的指针数组。但是为什么要将它分配给int**?我很难理解这一点。

int **arr = new int*[10]; 

【问题讨论】:

  • 如果int[]衰减为int*,那么int*[]将衰减为int**
  • 您通常使用T *arr = new T[N];。如果Tint,那么它就变成int *arr = new int[N];。如果Tint *,那么它就变成了int **arr = new int*[N];
  • 使用 std::vector,而不是 new[]。

标签: c++ arrays pointers dynamic-memory-allocation


【解决方案1】:

根据 C++ 标准(4.2 数组到指针的转换)

1 类型为“N T 数组”或“未知数组”的左值或右值 T 的边界”可以转换为“指向 T 的指针”类型的纯右值。这 result 是指向数组第一个元素的指针。

例如,如果您有这样的数组

int a[] = { 1, 2, 3, 4, 5 };

然后在这个声明中

int *p = a;

用作初始化器的数组指示符被隐式转换为指向其第一个元素的指针。

所以一般来说,如果你有数组

T a[N];

然后在有极少数例外的表达式中,它被转换为指向其第一个 T * 类型元素的指针。

在此声明中

int **arr = new int*[10]; 

初始化器是一个数组元素,其类型为int *。您可以引入 typedef 或别名声明

typedef int * T;

using T = int *;

所以你可以写

T * arr = new T[10]; 

即指针arr 指向动态分配数组的第一个元素。由于数组元素的类型为int *,因此指向数组元素的指针类型为int **

即运算符new返回指向动态分配数组的第一个元素的指针。

【讨论】:

  • 虽然密切相关,但问题的代码中不会发生数组到指针的转换。 new-expression 的类型已经是指针而不是数组。
  • @user2079303 为了让理解更清楚,我描述了一般原理。
猜你喜欢
  • 1970-01-01
  • 2017-08-26
  • 2017-07-03
  • 2021-11-08
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多