c++ - 如何强制新操作员根据我的需要解释语句
问题描述
我正在学习 C++。如果我想声明指向数组的指针,我将使用:
int (*p)[10];
但如果我想声明指针数组,我将使用:
int *(p[10]);
但是,如果我使用 new 运算符,则没有变量名,例如 p,我必须写:
x = new int *[10];
问题是:编译器如何确定该语句分配的内存大小,它是指针数组还是指向数组的指针。另外,我如何强制编译器解释int *[10]
我需要的含义?
解决方案
要声明指向 的指针数组int
,您不需要括号:
int* p[10];
会做。要声明一个指向 10 个整数数组的指针,您确实需要括号:
int (*p)[10];
这只是运算符优先级的问题。比在声明[]
器中绑定得更牢固。因此,如果没有括号,它将是一个由十个 ( apply first) 指向 ( apply second)的指针组成的数组。中的括号是多余的。另一方面,声明一个指向(首先应用,因为)10 的数组(应用第二)的指针。*
int *p[10];
[10]
*
int
int *(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]
数组,其中不必是常量表达式。与对其他类型的操作方式相反,如果您要求创建数组类型的对象,n
int
n
new
new
new
不返回指向给定类型数组的指针,而是返回指向它创建的数组的第一个元素的指针。因此,即使您创建一个大小不是常量表达式的数组,new-expression的结果类型也永远不会是“动态大小的数组”,而始终是类型中实际存在的东西系统…
有一个逃生舱的想法。新表达式的语法是[expr.new]/1
new-expression :
::
optnew
new-placement opt new-type-id new-initializer opt
::
optnew
new-placement opt(
type-id)
new-initializer opt
如您所见,可以为new-expression指定new-type-id(这是允许创建动态大小数组的单独语法)或括号中的普通type-id。
因此,实际上可以通过以下方式创建指向十个数组的单个int
指针new
:
int (**p)[10] = new (int(*)[10]);
推荐阅读
- amazon-web-services - ClientError:使用地面实况图像的 AWS object_detection_augmented_manifest_training 未指定训练通道
- mysql - 如何在没有通用“GROUP BY”元素的情况下组合来自 2 个查询的结果
- php - PHP 图像调整大小和展开占位符(透明)
- twitter-bootstrap - XPages 中的 bootstrapValidator
- android - 如何清理这些复杂的按钮?
- assembly - NASM 中的 FSTP 指令不会写入内存
- python - 如果我有完整的 url,如何使用函数 socket.gethostbyname 获取 IP 地址?
- java - 如何编写 REST API 并向使用现有 Web 应用程序的 REST API 的 android 用户提供身份验证?
- java - 如何在嵌套的 for 循环完成后运行 if 语句?
- three.js - Three.js DecalGeometry 不是构造函数