You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中new语句里*运算符的结合性问题

关于C++动态创建Person指针数组的语法解析

核心语法拆解

你最初的代码Person **arr = new Person* [size];是完全正确的,这里的语法逻辑可以拆成两部分:

  • Person* [size]表示大小为size的Person指针数组,数组的每个元素都是Person*类型;
  • new操作符会在堆上分配这个数组的内存,并返回数组的首地址——因为数组元素是Person*,所以首地址的类型是Person**(指向指针的指针),刚好能赋值给arr。

关于*的结合性:在C++声明语法里,[]的优先级高于*,所以Person* [size]里的*是和Person结合,构成元素类型Person*,再用[size]表示这个类型的数组。这和静态声明Person* arr[10]的逻辑是一致的——静态声明里arr是数组,每个元素是Person*,本质和new创建的数组类型完全相同,只是静态数组是栈上的变量,而new创建的是堆上的动态数组。

两种带括号的new写法分析

你尝试的两种写法本质上是对new操作的目标类型理解有误:

  • 写法1:new ((Person*)[size])
    这个写法语法无效,(Person*)是强制类型转换表达式,无法和[size]组合成合法的数组类型。你想要表达的“Person指针的数组”,正确的类型写法就是Person*[size],不需要额外加括号包裹Person*。
  • 写法2:new (Person (*)[size])
    这里你声明的目标类型是指向Person数组的指针(即Person (*)[size]),所以new会返回一个指向该指针的指针(Person (**)[size]),这和你需要的Person**完全不是一回事。而且更关键的是,Person (*)[size]里的size必须是编译期常量(静态数组大小要求),所以这种写法根本不支持运行时动态确定大小,完全不符合你的需求。

静态声明与动态new的语法差异澄清

你觉得“相悖”是因为混淆了变量声明和类型声明的语法:

  • 静态声明Person* arr[10]是变量声明:先识别arr[10](数组),再确定元素类型是Person*;
  • new Person*[size]里的Person*[size]是类型声明:直接明确“元素为Person*、大小为size的数组”,写法上更直接体现数组的元素类型。
    两者的本质逻辑是统一的,只是语法场景不同导致写法看起来有差异。

注意事项

用new创建动态指针数组后,记得:

  • 逐个初始化数组元素(比如arr[i] = new Person(...));
  • 销毁时要先逐个delete每个Person*元素,再用delete[] arr释放数组本身,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Newton's in-law

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 05:53:22