0

重複の可能性:
C++ で配列を使用するにはどうすればよいですか?

ポインターを介して C++ の関数に 2 次元配列を渡すにはどうすればよいですか。以下のコードを試すと、次のエラーが発生します。

エラー: 引数 '1' を 'void fn(int **)' にするために 'int (*)[10][10]' を 'int **' に変換できません

void fn(int **a)
{
cout<<a[0][0]<<" "<<a[0][1];
}

int main()
{

int A[10][10];
A[0][0]=1;
A[0][1]=2;

fn(&A);   //????
}
4

5 に答える 5

2

あなたが行った方法で作成された2D配列は、メモリ内で隣接しています。コンパイラは、関数内の次のセグメントにポインタを移動できるように、各セグメントのサイズを知る必要があります。fn(int (*a)[3])またはを書くことfn(int a[][3])は同等です。しかし、例を見てみましょう

char a[3][3];

a[0][0] = 01;
a[0][1] = 02;
a[0][2] = 03;
a[1][0] = 04;
a[1][1] = 05;
a[1][2] = 06;
a[2][0] = 07;
a[2][1] = 08;
a[2][2] = 09;

となります

|01|02|03|04|05|06|07|08|09|

メモリ内。

したがって、関数に渡す場合は、にアクセスするためにptraを増やす必要があることを知っておく必要があります。a3 * sizeof(a)a[1][0]

要するに:関数のプロトタイプはまたはである必要がありvoid fn(int a[][10])ますvoid fn(int (*a)[10])

于 2012-10-13T16:50:18.563 に答える
1

@Rからのリンクによると。Martinho Fernandes、以下は有効なC++です。

int array_of_arrays[6][7];
int (*pointer_to_array)[7] = array_of_arrays;

したがって、以下も有効である必要があります。

void fn (int (*a)[10]) 
{
     cout<<a[0][0]<<" "<<a[0][1];
}

そして、私は以下も有効であると信じています:

void fn (int a[][10]) 
{
    cout<<a[0][0]<<" "<<a[0][1];
}
于 2012-10-13T16:47:57.043 に答える
0

C ++の配列は、配列の最初の要素の場所へのポインターとして扱うことができます。2次元配列はポインターの配列と考えることができ、各ポインターは別の配列を指します。これは厳密には配列の実装方法を示しているわけではありませんが、Cは配列と最初の要素へのポインターの間の暗黙的な変換をサポートしており、それらは同じものと考えることができます。Array [index]は、の単なる構文糖衣です*(Array + index*sizeof(whatever's in the array))。したがって、関数を機能させるには、次のことを実行できます。

void fn(int (*a)[10]) {
    cout<<a[0][0]<<" "<<a[0][1];
}

int main() {

    int A[10][10];
    A[0][0]=1;
    A[0][1]=2;

    fn(A);
}

配列はすでにポインタであるため、最初に配列のアドレスを取得する必要はありません。ただし、C ++を使用しているため、標準のコンテナーの使用を検討する必要があります。

void fn(vector< vector<int> > const&a) {
    cout<<a[0][0]<<" "<<a[0][1];
}

int main() {

    vector< vector<int> > A( 10, vector<int>(10) );
    A[0][0]=1;
    A[0][1]=2;

    fn(A);
}
于 2012-10-13T16:48:30.913 に答える
0

C ++は、2Dインデックスを実行するために、(1次元の)配列サイズを知る必要があります。

試す:

void fn(int a[][10]) {
    cout<<a[0][0]<<" "<<a[0][1]; 
}
于 2012-10-13T16:03:47.763 に答える
0

fn() を次のように宣言する必要があります

void fn(int (&a)[10][10])
于 2012-10-13T15:58:52.507 に答える