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

4

SPTR,按照定义,是“2 条短裤数组”的别名。因此,SPTR *与“指向 2 个短裤数组的指针”相同,即short int (*)[2].

同样,pq是指向 2 个短裤数组的指针。

该代码选择了一个二维字符数组,并将其第二个位置 ( ) 解释为由anda2D[1]指向的 2 个短裤的数组。换句话说,这个 3 个字符的数组:pq

{ 4, 5, 6 }

被解释为短数组,并且两者都p指向q它。由于p是指向 2 个短裤数组的指针,因此递增p将使其sizeof(short)*2向前移动。为什么?好吧,递增p与使其指向下一个 2 个短裤的数组相同,也就是sizeof(short)*2字节距离。

假设 8 位字符和 16 位短路,(*++p)[1]将增加p32 位,所以现在p指向子数组{ 8, 9 }(这是 的效果++p)。然后,我们取消引用p,这意味着“选择该位置的数组”。现在,我们有一个数组索引运算符,您可以将其视为将*p((*p)+1将指向的新值加 1 {10, 11, 12},记住它向前 16 位,因为这是 short 数组中每个元素的大小),并且然后取消引用。因为这被解释为很短,所以取消引用实际上会读取1011,因为我们之前假设每个字符都是 8 位。因此,p“认为”他正在阅读短片,因此将读取 16 位(2 个字符)。

现在,会发生什么取决于您的机器是小端还是大端。如果它打印B0A,那么它是小端,因为它被解释10为最低有效字节。否则,它是大端。

可以使用相同的方法来了解发生了什么(q[1])[2],这与q[1][2]. 把它想象成*(*(q+1)+2)q+1指向8。将 2 添加到*(q+1)然后取消引用它与在位置 2 索引一个短裤数组相同,因此您将获得之后存储 32 位的任何内容,即12. 与以前相同,具体取决于您机器的字节序。它将打印C0DD0C.

于 2013-10-30T13:23:49.750 回答
2

如何解释pq

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 和改进发布的代码

由于您使用pandq来保存来自 的元素的地址a2D,因此最好将SPTRtypedef' d 设置为

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]);

如前所述,p指向char大小为 2 的数组。

*p给你数组的第一个元素的地址。

For char a[2],a为您提供数组第一个元素的地址,a[0]*(a+0)为您提供数组中第一个元素的值。

同样在这种情况下,(*p)[0]*((*p)+0)为您提供指向的数组的第一个元素p。在您的情况下,它将是4. 相同,q因为两者都拥有相同的地址。

(*p)[1]为您提供指向的数组的第二个元素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]旁边是一个字符q[1][1],因此会给你8


笔记:

  • a是类型pointer-to-char
  • p是类型pointer-to-array-of-2-chars

两者的类型不同。我已经提到a,只是为了容易理解涉及的表达方式*p

于 2013-10-30T13:40:51.327 回答