web-dev-qa-db-ja.com

2D配列へのポインター

2D配列へのポインタについて質問があります。配列が次のようなものである場合

_int a[2][3];
_

次に、これは配列aへのポインタですか?

_int (*p)[3] = a;
_

これが正しい場合、int(*p)[3]から_[3]_はどういう意味ですか?

48
user1047092

int[2][3]を「2D配列」として参照するのではなく、「配列の配列」と見なす必要があります。これは、2つのアイテムが含まれる配列です。各アイテム自体は、3つのintを持つ配列です。

int (*p)[3] = a;

pを使用して、aの2つの項目のいずれかを指すことができます。 pは3つのint配列、つまり最初のそのような項目を指します。 p+1は、2番目の3整数配列を指します。 2番目の要素を指すようにpを初期化するには、次を使用します。

int (*p)[3] = &(a[1]);

以下は、2つの項目の最初を指す同等の方法です。

int (*p)[3] = a; // as before
int (*p)[3] = &(a[0]);
36
Aaron McDaid
_int a[2][3];
_

aは、単純に配列の配列であるintの配列3の配列2として読み取られます。書くとき、

int (*p)[3] = a;

parrayである最初の要素へのポインタとして宣言します。したがって、pは、配列の配列の要素である3つのintの配列を指します。

この例を考えてみましょう:

_        int a[2][3]
+----+----+----+----+----+----+
|    |    |    |    |    |    |
+----+----+----+----+----+----+
\_____________/
       |
       |    
       |
       p    int (*p)[3]
_

ここで、pは、配列の配列の要素である3つのintの配列を指すポインターです。

37
cpx

厳密に言えば、いいえ、int (*p)[3] = a;aへのポインターではありません。これは、aの最初の要素へのポインターです。 aの最初の要素は、3つのintの配列です。 pは、3つのintの配列へのポインターです。

配列aへのポインターは次のように宣言されます。

_int (*q)[2][3] = &a; 
_

pqの数値は同じである可能性が高い(または必要である可能性もあります)が、タイプは異なります。これは、pまたはqで算術演算を実行するときに作用します。 _p+1_は配列aの2番目の要素を指しますが、_q+1_は配列aの終わりを超えたメモリを指します。

覚えておいてください: cdecl はあなたの友達です: _int a[2][3]_int (*q)[2][3] .

8
Robᵩ

[3]はタイプの一部です。この場合、pは、intを保持するサイズ3の配列へのポインターです。

配列の特定の型には常にサイズが含まれているため、int *[3]またはint *[5]、しかしint *[]サイズが未定義です。

int *x[20]; /* type of x is int *[20], not just int *[] */
int y[10][10]; /* type of y is int[10][10], not just int[][] */
5

また注意してください:

int *p[5]        // p is an array of 5 pointers

int (*p)[5]      // p points to an array of 5 ints

int (*(p+5))[10] // p is a pointer to a structure where the structure's 5th element has 10 ints .
1
sdinesh94

あなたは1D配列のような2D配列を指すことができます

#include <iostream>
int main()
{
   int array[2][2] = {{0,1}, {2,3}}; // array
   int *ptr;
   ptr=(int*)array;
   std::cout << *(ptr)   << '\n';//out 0
   std::cout << *(ptr+1) << '\n';//out 1 
   std::cout << *(ptr+2) << '\n';//out 2
   std::cout << *(ptr+3) << '\n';//out 3
}
0
reza moradi