typedef short int(SPTR)[2];
SPTR *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,q);
printf("%x %x\n", (*++p)[1], (q[1])[2]);
printf("%x %x\n", p, q);
任何机构都可以在上面的问题中用指针解释数组,这是一个客观的问题。
答案 0 :(得分:3)
typedef short int(SPTR)[2];
将SPTR
定义为两个short int
的数组。
SPTR *p, *q;
将p
和q
定义为指向两个short ints
数组的指针。如果没有typedefs
,您可以将它们定义为:
short int (*p)[2];
short int (*q)[2];
p = q = (short int(*)[2])a2D[1];
这是滥用该语言的显式演员设施。
鉴于a2D
的声明,a2D[1]
的类型为char [3]
,即3 char
的数组。当在上面的表达式中使用时,它会衰减到指针char*
。如果没有明确的强制转换,上面的分配就会失败。
之后的其他事情很难理解。它属于未定义行为的类别。