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
相关产品推荐
相关产品推荐

