0

我有这个代码:

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++ 中指针和数组之间的区别时,我总是遇到这个问题。他们不应该是一样的吗?任何人都可以帮助我吗?

4

5 回答 5

2

您的问题不是数组指针差异(很大)。

问题是数组不能在赋值中按值复制。将 C 数组包装在一个类中可以解决它,或者更好 - 使用标准数组。

于 2012-11-03T09:14:38.020 回答
1

在某些情况下,数组可以转换为指针。从来没有任何转换是你正在尝试的其他方式。

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

class Board
{
...
private:
   int sq[3][3];
};

typedef std::vector<std::pair<Board, int> > History;

这样您将停止使用无用的数组,并且您不会对数组和指针产生混淆。

于 2012-11-03T09:14:33.563 回答
1

不能怪你,因为数组与指针的区别通常仅在动态大小的结构中实现。

数组 int a[3][4][5][6] 例如是从内存中线性分配的。它包含 3*4*5*6 个单位,其中 a[2][3][4][0] ... a[2][3][4][5] 在 6 个连续索引中,其中 a[ 0][1][n][5] 分别是 6 个元素,其中 a[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 的维度不可能从该语法中确定。

于 2012-11-03T09:15:14.267 回答
1

问题的根源在于 C 和 C++ 处理多维数组的方式。当const涉及时,问题会放大。

std::pair<int [3][3], int>是一对值,其中第二个是 an int,第一个是指向 的数组的指针int[3]。出于多种原因,第一个元素是有问题的。一是它是一个指针。另一个是const对多维数组做了奇怪的事情。这就是你遇到的问题。

您想要的是一个 3x3 数组作为对象。所以——让它成为一个对象:

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

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

于 2012-11-03T09:23:48.163 回答
1

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

  • 将模板中的T1定义为int (*const)[3]
  • 将 your 定义board动态分配的数组。(与int (*board)[3] = new int[3][3];
  • 危险: const_cast<> 你board到一个非常量变量。(最好不要这样做:D)

LG ntor

PS:但是,我还建议为此编写一个类并重载 [] 运算符。更先进的技术;)

于 2012-11-03T09:29:54.257 回答