1
typedef short int (SPTR) [2];    
SPTR *p,*q;

p と q をどのように解釈しますか?

さらに、質問は次のようになります。

char a2D[5][3] =    
{
  { 1,  2,  3},
  { 4,  5,  6},
  { 7,  8,  9},
  {10, 11, 12},
  {13, 14, 15}
};
p = q = (short int (*)[2])a2D[1];
printf("%X %X\n", (*++p)[1], (q[1])[2]);   

誰かがコードの動作を理解するのを手伝ってくれますか..

4

2 に答える 2

2

解釈する方法pq?

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]ます。でインクリメントq1ます。前述の同じポインター演算もp適用されますq。そして、ここでも と の両方が同じアドレスpq指しています。だから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

于 2013-10-30T13:40:51.327 に答える