int (*p) [4] ;
这里的 "p" 是指向一个包含 4 个整数的数组的指针吗?
那么如何为这个指针调用 "new" 呢?
“p”是指向一个包含4个整数的数组的指针吗?
正确!
我该如何为这个指针调用“new”?
例如,p = new int[7][4]
。
new int[7][4]
的类型确实是 int (*)[4]
。也许使用typedef更明显?typedef int row[4]; row *p = new row[7];
这与我的代码完全等效,只是更易读。你会认为这也是错误的吗? - fredoverflowchar*
可以指向C字符串的字符一样)。 - fredoverflowint (*p)[4]
实际上是一个指向包含四个 int
的数组的指针。
您可以通过以下方式动态分配类型为“指向四个 int
数组”的对象。
int (**ptr)[4] = new (int (*)[4]);
int *ptr = new int[4];
int (*p)[4] = new int[1][4];
即使它只是一个长度为1的数组(包含4个整数的数组),您仍然需要使用delete[]
来释放p
。
delete[] p;
delete
的位置。 - GManNickGdelete[] p;
删除数组。因此,p = new int[1][4];
... delete[] p
和p = new int [4][4];
... delete[] p
。调用数组成员上的delete(delete[] p[i]
或delete p[i]
)是无效的。 - CB Baileynew[]
可以分配由运行时状态决定大小的数组,但是现在,9年后,我们确实有编译器非常好地跟踪constexpr
,并且在new int[6]
和new int[x]
之间存在明显的编译时与运行时差异,其中x是int
和new int[x]
其中x是constexpr.. 在我看来,第一个可以轻松返回(int(*)[6])
类型,而最后一个则为(int(*)[x])
...我只希望这在某个时候被纳入标准中。 - quetzalcoatl在线CDECL评估器是一个对于此类问题非常有帮助的资源:
cdecl
C gibberish ↔ English
int (*p)[4];
declare p as pointer to array 4 of int
int (*p)[4];
不是 声明 p
,而是 定义 它。(至少在本问题所涉及的 C++ 中是这样。正如 Johannes 曾经指出的那样,在某些领域,C 和 C++ 在什么是定义和什么是声明方面存在差异。) - sbiint foo() { return 42; }
不是一个语句 ;) - fredoverflow<blush>
撤销上一条评论。那么它是什么?本地自动变量的定义不被认为是语句吗?无论如何,我的观点是:人们总是搞混声明和定义。(例如,超过一半的答案在https://dev59.com/V3M_5IYBdhLWcg3wXx1N上要么误导,要么完全错误,在评论中,人们不断提出愚蠢的反例(`int i;`不是定义),我不得不添加标准引用来解决关于类定义与类声明的讨论)。所以我想用精确的方式表达它。 - sbi{ statement-seq[OPT] }
。局部自动变量声明(和定义)是一个“声明语句”,由一个“块声明”组成,其中包含一个“简单声明”。在函数体之外,一个“简单声明”可以出现在不是“语句”的上下文中。 - CB Bailey
std::vector<>
与int (*p)[4]
是完全不同的东西! - Sethint (*p)[4]
可以更好地被两个维度的std::vector<std::vector<int> >
或一个带有手动索引算术的一维std::vector<int>
或者是boost::multi_array<int, 2>
替换。 - fredoverflow