c ++动态指针数组[重复]

Posted

技术标签:

【中文标题】c ++动态指针数组[重复]【英文标题】:c++ dynamic array of pointers [duplicate] 【发布时间】: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[]。 【参考方案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 为了让理解更清楚,我描述了一般原理。

以上是关于c ++动态指针数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c语言中如何定义动态指针数组

怎么动态分配指针数组

(C/C++)区别:数组与指针,指针与引用

C语言指针(指针数组数组指针函数指针传参回调函数等)超详细

为啥在 C 中为数组声明和指向数组声明的指针动态分配的内存不同? [复制]

C语言里,啥时候用数组啥时候用指针和动态内存(malloc/calloc)?