(5)配列ポインタとポインタ配列

配列ポインター(行ポインターとも呼ばれます)

配列ポインタ。文字通り「配列へのポインタ」を意味します。

定义 int (*p)[n];

()優先度が高い。まず、pは整数の1次元配列へのポインタである。この1次元配列の長さはnであり、これはpのステップサイズとも言えます。つまり、p + 1が実行されるとき、pはn個の整数データの長さにまたがる必要があります。

2次元配列をポインタに割り当てる場合は、次のように割り当てる必要があります
。inta [3] [4];
int(* p)[4]; //このステートメントは、配列ポインタを定義するためのものです。 4つの要素を持つポインターを指す次元配列。
p = a; // 2次元配列の最初のアドレスをpに割り当てます。つまり、a [0]または&a [0] [0]
p ++; //ステートメントの実行後、つまりp = p +1; p線a [0] []を横切ると、線a [1] []を指します。

したがって、配列ポインターは、1次元配列へのポインターまたは行ポインターとも呼ばれます。

ポインタ配列

ポインタの配列は、文字通り、要素がポインタである配列です。

定义 int *p[n];

[]優先度が高く、最初にpと組み合わせて配列を形成し、次にint *は、これがn個のポインター型配列要素を持つ整数ポインター配列であることを示します。ここでp + 1を実行すると、pは次の配列要素を指すため、割り当てが間違っています。p= a; pは不明な表現であるため、p [0]、p [1]、p [2]のみです。 。p[n-1]であり、変数アドレスを格納するために使用できるポインター変数です。ただし、次のようになります。p= ​​a;ここで、 pはポインタ配列の最初の要素の値、およびaの最初のアドレスの値を表します。
2次元配列をポインタ配列に割り当てるには:
int * p [3];
int a [3] [4];
p ++; //このステートメントは、p配列が次の配列要素を指していることを示します。注:この配列の各要素は、
(i = 0; i <3; i ++)
p [i] = a [i]のポインターです。
ここで、int * p [3]は、1次元に3つのポインターが格納されていることを意味します。配列変数はp [0]、p [1]、p [2]である
ため、個別に割り当てる必要があります。

このように、2つの違いは突然明らかになります。配列ポインタは単なるポインタ変数であり、C言語で2次元配列を指すために特に使用されているようで、ポインタのストレージスペースを占有します。メモリ内。ポインタ配列は複数のポインタ変数であり、配列の形でメモリに格納され、複数のポインタの記憶空間を占有します。
説明が必要なもう1つのポイントは、2次元配列を同時に指すために使用される場合、参照は配列名による参照と同じであるということです。
たとえば、配列の行iと列jの要素を表すには、次のようにします。

*(p[i]+j)*(*(p+i)+j)(*(p+i))[j]、p[i][j]

优先级:()>[]>*

ポインタ配列と配列ポインタのメモリレイアウト

ポインタ配列:まず、配列です。配列の要素はポインタです。配列が占めるバイト数は、配列自体のサイズによって決まります。各要素はポインタです。32ビットシステムでは、任意のタイプのポインタは常に4バイトを占めます。「ポインタの配列」の略です。
配列ポインタ:まず、配列を指すポインタです。32ビットシステムでは、どのタイプのポインタも常に4バイトを占有します。配列が指すバイト数については、配列のサイズによって異なります。「配列へのポインタ」の略です。

次のうち、配列ポインタとポインタの配列はどれですか?

A)
int *p1[10];
B)
int (*p2)[10];
  • 「[]」は「*」よりも優先されます。p1は最初に「[]」と組み合わされて配列の定義を形成します。配列名はp1であり、int *は配列の内容、つまり配列の各要素を変更します。これで、これがint型データへの10個のポインター、つまりポインターの配列を含む配列であることがわかりました。

  • p2については、理解したほうがいいです。ここでは、「()」の優先度が「[]」の優先度よりも高くなっています。「*」記号とp2は、ポインタの定義を構成します。ポインタ変数の名前はp2です。 intは、配列の内容、つまり配列の各要素を変更します。ここでは配列に名前はありません。匿名の配列です。これで、p2がポインターであることがわかりました。これは、10個のint型データを含む配列、つまり配列ポインターを指します。次の図を使用して、理解を深めることができます。
    ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_40329851/article/details/114298016