C++ 为什么新(*)[2]被禁止?

C++ 为什么新(*)[2]被禁止?,c++,C++,编辑流动代码时: int (*p)[2] = new int [2][2]; //it's right. int (*q)[2] = new int (*)[2]; //it's wrong. //the wrong message:error: expected primary-expression before ')' token. //compile by g++ in Code::Blocks,Debug. 我能理解第一个。 但是,为什么第二个不能工作呢 编译器如何匹配类型? 很明

编辑流动代码时:

int (*p)[2] = new int [2][2];  //it's right.
int (*q)[2] = new int (*)[2];  //it's wrong.
//the wrong message:error: expected primary-expression before ')' token.
//compile by g++ in Code::Blocks,Debug.
我能理解第一个。 但是,为什么第二个不能工作呢

编译器如何匹配类型?
很明显,它与一般情况不匹配,而且对于新的情况必须有一些限制。我想我忽略了一些原则。

我有点把问题推到这里:我尝试的第一件事是有效的,但我不知道它为什么有效。您只需添加括号:

int (**q)[2] = new (int (*)[2]);

还要注意,更新一个T返回一个T*,因此更新一个指针返回一个指向指针的指针。

您认为*在做什么?或者应该做什么?如果我想要一个指向数组的新指针,我必须新建int[1][2]//这是我的另一个想法。指向数组的指针是new int[]做[2][2]创建一个大小为2的数组,数组的大小为2new int[]返回int*,我想要*[2]…昆汀给出答案,我应该添加括号并更改返回类型。谢谢你的回答!但是我不知道我为什么要加括号。是的,new int[1][2]是做你想做的事情的最简单的方法。我想我已经做到了:new int*[2]被解析为new[],其中t是int*,这没有意义。你的版本是新的,T=int*[2]指针指向int的数组。所以你基本上给数组分配了1个指针。我想,新版本可能会区分数组类型和非数组类型。我检查:new int[2][2]和new int[2][2]是工作。添加括号更好。也许只有在阅读了new的实现之后,我才能知道更多细节。使用T=int*[2]肯定会更可读;T*q=新的T;