如何解释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
andq
来保存来自 的元素的地址a2D
,因此最好将SPTR
typedef' 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