首页 > 解决方案 > 如何强制新操作员根据我的需要解释语句

问题描述

我正在学习 C++。如果我想声明指向数组的指针,我将使用:

int (*p)[10];

但如果我想声明指针数组,我将使用:

int *(p[10]);

但是,如果我使用 new 运算符,则没有变量名,例如 p,我必须写:

x = new int *[10];

问题是:编译器如何确定该语句分配的内存大小,它是指针数组还是指向数组的指针。另外,我如何强制编译器解释int *[10]我需要的含义?

标签: c++new-operator

解决方案


要声明指向 的指针数组int,您不需要括号:

int* p[10];

会做。要声明一个指向 10 个整数数组的指针,您确实需要括号:

int (*p)[10];

这只是运算符优先级的问题。比在声明[]器中绑定得更牢固。因此,如果没有括号,它将是一个由十个 ( apply first) 指向 ( apply second)的指针组成的数组。中的括号是多余的。另一方面,声明一个指向(首先应用,因为)10 的数组(应用第二)的指针。*int *p[10];[10]*intint *(p[10]);int (*p)[10];*()[10]int

new表情也不例外。唯一的区别是你的声明器不包含标识符,因为你没有声明一个要命名的变量,你只是拼写一个类型。new根据您要求它创建的对象的类型计算出它需要多少存储空间。

要简单地声明类型“由十个指向的指针组成的数组int”,您可以编写int* [10]. 并且要声明类型“指向十个 int 数组的指针”,您可以编写int (*)[10].

但是,在 的上下文中存在一个问题new。这个问题是 C++ 中数组类型的边界必须是常量表达式(即编译时常量)。C++ 类型系统中不存在动态大小的数组。但是,重点new是动态创建对象,特别是动态大小的数组。

为了解决这个问题,new必须避免要求将动态大小的数组命名为类型。目前在 C++ 规范中实现这一点的方式是为new-expressions [expr.new]/1拥有一个完全独立的声明符语法。发生的情况是顶层数组边界被剥离并单独处理。编写时,您创建了一个类型为 的对象new int[n]数组,其中不必是常量表达式。与对其他类型的操作方式相反,如果您要求创建数组类型的对象,nintnnewnewnew不返回指向给定类型数组的指针,而是返回指向它创建的数组的第一个元素的指针。因此,即使您创建一个大小不是常量表达式的数组,new-expression的结果类型也永远不会是“动态大小的数组”,而始终是类型中实际存在的东西系统…

有一个逃生舱的想法。新表达式的语法是[expr.new]/1

new-expression :
::opt new new-placement opt new-type-id new-initializer opt
::opt new new-placement opt ( type-id ) new-initializer opt

如您所见,可以为new-expression指定new-type-id(这是允许创建动态大小数组的单独语法)或括号中的普通type-id

因此,实际上可以通过以下方式创建指向十个数组的单个int指针new

int (**p)[10] = new (int(*)[10]);

推荐阅读