c++ - 指向数组的指针和错误 C2057、C2540

标签 c++ arrays compiler-errors restrictions pointer-to-array

我想做这样的事情:

const int N = 10;
void foo (const int count)
{
  int (* pA) [N][count] = reinterpret_cast<int(*)[N][count]>(new int[N * count]);
  ...
}

但我的编译器 (VS2010) 不想这样做:

error C2057: expected constant expression
error C2540: non-constant expression as array bound

这样表达他对计数的不满。

我知道如何通过实现稍微不同的方式来解决这个问题。但我只是不明白,为什么 C++ 禁止我使用这种 方式。我明白,为什么 C++ 需要在编译时知道栈上数组的大小(以分配数组内存)。但是为什么对于指向数组的指针需要同样的限制(毕竟,指针只是使用分配的内存的一种工具)?

最佳答案

嗯,实际上你想要的在原则上是好的,但是你使用了错误的语法。

除了第一个维度之外的所有维度都必须是编译时常量,因为它们用于指针运算。第一个可以是运行时变化的。这有效:

int (* pA)[N] = new int[count][N];

请记住,数组与指向元素的指针类型兼容,并且下标在两者上的工作方式完全相同。因此,当您分配了一个二维数组(数组的数组)时,您应该存储一个指向一维数组的指针。

不过,没有办法执行 int[N][count],因为这需要一个可变大小的元素数组(子数组)。

此外,请注意 N 是一个常量表达式,但 count 不是。即使它们具有相同的类型,count 也是一个参数,在运行时确定。

如果你想接受一个常量整数表达式作为参数,将它设为模板参数:

template <int count>
void foo()

现在 count 是一个常量表达式,就像 N 一样。

关于c++ - 指向数组的指针和错误 C2057、C2540,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27472776/

相关文章:

c++ - FFmpeg 提取当前帧时间戳

c++ - Informix OIC++ : query yields error MI_LIB_USAGE/Argument (client library error) is NULL

java - 求两个元素之和的最小绝对值

visual-studio - 在TFS项目中,Visual Studio将WCF类标记为 “Type or namespace could not be found”,但是可以完美地编译和构建它们

c++ - 编辑链表中的数据错误: no match for operator==

c++ - 使用 const 引用与 const 变量声明常量文字字符串

c++ - protected 基类成员可以在派生类中初始化吗

C++ |无效*数据[1000]

php - PHP 数组键有大小限制吗? PHP 数组一般有哪些限制?

oracle - 第 4 行错误 : PL/SQL: SQL Statement ignored