解釈する方法pとq?
typedef short int (SPTR) [2]; //Have brackets around SPTR or not. Its the same.
SPTRインスタンスのタイプはshort int [2]です。
SPTR *p, *q;
pq型であるshort int (*) [2]
OPと改善によって投稿されたコードを理解する
から要素のアドレスを保持するためにpandを使用しているので、 typedef を次のように指定するとよいでしょう。qa2DSPTR
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