无法弄清楚 int[3][3] 和 int(* const)[3] 之间的区别

can't figure out difference between int[3][3] and int(* const)[3]

本文关键字:int 之间 const 区别 弄清楚      更新时间:2023-10-16

我有此代码:

int board[3][3];        // I am ommiting initialization code for board here so as not to clutter it.
typedef std::vector<std::pair<int [3][3], int> > History;
History hist = History();
const std::pair<int[3][3], int> p = std::make_pair(board, cell);
hist.push_back(p);

但是用G 编译它给了我我无法理解的错误:

In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0,
                 from /usr/include/c++/4.7/vector:61,
                 from performancesystem.h:29:
/usr/include/c++/4.7/bits/stl_pair.h: In instantiation of
    ‘std::pair<_T1, _T2>::pair(const std::pair<_U1, _U2>&) [with _U1 = 
    int (*)[3]; _U2 = int; _T1 = int [3][3]; _T2 = int]’:
Test.cpp:74:65:   required from here
/usr/include/c++/4.7/bits/stl_pair.h:111:39: error: incompatible types in
    assignment of ‘int (* const)[3]’ to ‘int [3][3]’

我总是遇到这个问题,了解C 中指针和数组之间的差异。他们不应该是同一件事吗?谁能帮我吗?

您的情况下的问题不是数组销差差异(这很大)。

问题在于,分配中的数组不能在分配中得到值。将C阵列包装在类中可以解决或更好 - 使用标准数组。

不能怪您,因为数组与指针的差异通常仅在动态尺寸的结构中实现

阵列int a [3] [4] [5] [6]例如是从内存线性分配的。它包含3*4*5*6个单位,其中a [2] [3] [4] [0] ... a [2] [3] [4] [5]连续6个索引,其中a [0] [1] [1] [n] [5]每个6个元素,其中一个[1] [n] [3] [6]分开5*6个元素,等等。

指针提供了"间接"。可以通过first_level数组A [3]实现多维数组,从而提供3个指示器(间接指示)到下一个级别阵列B [4],C [4]和D [4],每个级别提供了下一个级别的间接性,等等。

在许多现实生活中的应用中(例如,指向字符串的指针),人们真的看不到差异,因为语法隐藏了细节:

int main(int ac, char **av) {//一个人可以用 av[2][2]获得第三个字符串的第三个字符,即使可以用 int main(int ac, char *av[]);表示原型,但不能用 int main(int ac, char av[][]);表示,因为表AV的尺寸无法从该语法中确定。

在某些情况下,可以将其转换为指针。从来没有任何转换是您正在尝试的。

要前进,您应该停止直接使用数组。它们在C 中相当无用。我会写一个新类(如果愿意的话,或者结构)

class Board
{
...
private:
   int sq[3][3];
};
typedef std::vector<std::pair<Board, int> > History;

这样,您将停止使用无用的数组,而您不会对数组和指针感到困惑。

问题的根源是C和C 处理多维数组的方式。涉及const时的问题会放大。

std::pair<int [3][3], int>是一对值,第二个是int,第一个是int[3]数组的指针。由于多种原因,第一个元素是有问题的。一个是这是指针。另一个是const对多维阵列做奇怪的事情。那是您遇到的问题。

您想要的是一个3x3数组作为对象。所以 - 使其成为对象:

struct Board {
   int arr[3][3];
};

现在,您的对变为std::pair<Board,int>,您的向量A std::vector<std::pair<Board, int> >。现在,您可以安全地构造Boardint对局部变量,因为Board已复制。您无法使用RAW C多维数组安全地执行此操作,因为第一个元素将是指针。

您的board定义了常数指针。int (* const)[3]实际上与int[n][3]变量相同:只是一个指向3个整数的指针(尽管第一个是常数)!
您有三个选择:

  • 在模板中定义 t1 int (*const)[3]
  • 将您的board定义为动态分配的数组。(使用int (*board)[3] = new int[3][3];
  • 危险: const_cast&lt;>您的board到非const变量。(最好不要这样做:D)

lg ntor

ps:但是,我还建议为此写一堂课,并超载[] - 操作员。更多的最新状态;)