gpt4 book ai didi

c++ - 理解 new[] 中的顺序

转载 作者:行者123 更新时间:2023-12-02 11:56:41 25 4
gpt4 key购买 nike

我了解 new[] 的用法是:new <type>[<size>] 。现在,假设我想分配一个列数为 nCols 的矩阵在编译时已知。就上述用法而言,typeint[nCols] 。所以,我想写:

const int nCols = 5;
int nRows;
cin >> nRows;
int (*matrix)[nCols] = new (int[nCols]) [nRows];

为什么正确的写法居然是 new int[nRows][nCols]

最佳答案

How come the correct way of writing it is actually new int[nRows][nCols]?

简单地说,因为您可以在表达式两边加上括号(1 + 1(1 + 1) 都是有效的,并且计算结果相同),但不允许在任意类型两边加上括号(int 是有效类型,但 (int) 不是)。

类型名称内的括号始终具有语义功能(例如声明函数指针),它们不仅仅是分组。 cppreference has an example说明这一点:

new int(*[10])(); // error: parsed as (new int) (*[10]) ()
new (int (*[10])()); // okay: allocates an array of 10 pointers to functions
<小时/>

此外,编写类型声明的语法(继承自 C)适用于 outwards-directed clockwise spirals 。请注意,您要为其分配存储的变量声明为

int (*matrix)[nCols]

变量是最里面部分。最后,C(和 C++)中的指针访问反射(reflect)了指针声明。因此,new[] 表达式镜像了声明语法,并且由于您想要分配 nRow 静态数组,因此您要分配的元素数量将被放入指针声明 ((*matrix))。

<小时/>

我建议不要用C++编写这样的代码。首先,在这里使用 constexpr 而不是 const,尽管在​​这种特殊情况下,裸露的 const 仍然有效。

但更重要的是,你几乎(?)永远不想使用new。使用 std::vector 代替手动分配数组:

std::vector<int[nCols]> matrix(nRows);
// or:
std::vector<std::array<int, nCols>> matrix(nRows);

关于c++ - 理解 new[] 中的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59649203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com