2D配列へのポインタについて質問があります。配列が次のようなものである場合
_int a[2][3];
_
次に、これは配列a
へのポインタですか?
_int (*p)[3] = a;
_
これが正しい場合、int(*p)[3]
から_[3]
_はどういう意味ですか?
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]);
_int a[2][3];
_
a
は、単純に配列の配列であるintの配列3の配列2として読み取られます。書くとき、
int (*p)[3] = a;
p
をarrayである最初の要素へのポインタとして宣言します。したがって、p
は、配列の配列の要素である3つのintの配列を指します。
この例を考えてみましょう:
_ int a[2][3]
+----+----+----+----+----+----+
| | | | | | |
+----+----+----+----+----+----+
\_____________/
|
|
|
p int (*p)[3]
_
ここで、p
は、配列の配列の要素である3つのintの配列を指すポインターです。
厳密に言えば、いいえ、int (*p)[3] = a;
はa
へのポインターではありません。これは、a
の最初の要素へのポインターです。 a
の最初の要素は、3つのintの配列です。 p
は、3つのintの配列へのポインターです。
配列a
へのポインターは次のように宣言されます。
_int (*q)[2][3] = &a;
_
p
とq
の数値は同じである可能性が高い(または必要である可能性もあります)が、タイプは異なります。これは、p
またはq
で算術演算を実行するときに作用します。 _p+1
_は配列a
の2番目の要素を指しますが、_q+1
_は配列a
の終わりを超えたメモリを指します。
覚えておいてください: cdecl はあなたの友達です: _int a[2][3]
_ 、 int (*q)[2][3]
.
[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[][] */
また注意してください:
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 .
あなたは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
}