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

1

定数ポインタboardを定義します。これは実際には変数と同じです。3つの整数の配列へのポインタです(最初は定数ですが)。 3つのオプションがあります。 int (* const)[3]int[n][3]

  • テンプレートでT1を次のように定義しますint (*const)[3]
  • を動的に割り当てられた配列boardとして定義します。(と)int (*board)[3] = new int[3][3];
  • 危険: const_cast<>boardを非const変数に変換します。(それをしない方がいいです:D)

LG ntor

PS:ただし、このクラスのクラスを作成して、[]演算子をオーバーロードすることもお勧めします。はるかに最先端の;)

于 2012-11-03T09:29:54.257 に答える
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 要素離れています。

ただし、ポインタは「間接化」を提供します。多次元配列は、次のレベルの配列 b[4]、c[4]、および d[4] への 3 つのポインター (間接参照) を提供する first_level 配列 a[3] によって実装できます。これらはそれぞれ、次のレベルへの間接参照を提供します。

多くの実際のアプリケーション (文字列へのポインターのテーブルなど) では、構文が詳細を隠しているため、実際には違いがわかりません。

int main(int ac, char **av) {// で 3 番目の文字列の 3 番目の文字を取得できますav[2][2]が、プロトタイプは で表すことができますが、テーブル av の次元はその構文からはおそらく決定できないため、int main(int ac, char *av[]);で表すことはできません。int main(int ac, char av[][]);

于 2012-11-03T09:15:14.267 に答える