解釈する方法p
とq
?
typedef short int (SPTR) [2]; //Have brackets around SPTR or not. Its the same.
SPTR
インスタンスのタイプはshort int [2]
です。
SPTR *p, *q;
p
q
型であるshort int (*) [2]
OPと改善によって投稿されたコードを理解する
から要素のアドレスを保持するためにp
andを使用しているので、 typedef を次のように指定するとよいでしょう。q
a2D
SPTR
typedef char SPTR [2];
後で、
p = q = (char (*)[2])a2D[1]; // Assigns p & q to point to element '4' in a2D array
printf("%X %X\n", (*++p)[1], (q[1])[2]);
前述のように、サイズ 2 の配列をp
指します。char
*p
配列の最初の要素のアドレスを提供します。
の場合char a[2]
、a
配列の最初の要素のアドレス、a[0]
または配列*(a+0)
の最初の要素の値が得られます。
この場合も同様に、(*p)[0]
or*((*p)+0)
は、 が指す配列の最初の要素を返しますp
。あなたの場合、それは になります4
。両方が同じq
アドレスを保持しているため、同じです。
(*p)[1]
が指す配列の 2 番目の要素を返します。p
式 では(*++p)
、p が だけインクリメントされ1
ます。これはポインター演算で1
あり、 が指すデータ型のサイズにスケーリングされp
ます。したがって、p
は によってインクリメントされ2 * sizeof (char)
、現在は を指してい6
ます。
(*++p)[0]
を与えます6
。あなたの場合、それは (*++p)[1]
であるため、7 が得られます。
q[1][1]
に似てい(*(q+1))[1]
ます。でインクリメントq
し1
ます。前述の同じポインター演算もp
適用されますq
。そして、ここでも と の両方が同じアドレスp
をq
指しています。だからq[1][1]
あなたにも与えます7
。
q[1][2]
次の1文字であるため、次のようにq[1][1]
なります8
ノート:
a
タイプですpointer-to-char
p
タイプですpointer-to-array-of-2-chars
どちらも種類によって異なります。a
を含む表現を簡単に理解するために、私は言及しました*p