任何人都可以用指针解释下面的数组声明

时间:2015-10-22 05:21:41

标签: c

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

任何机构都可以在上面的问题中用指针解释数组,这是一个客观的问题。

1 个答案:

答案 0 :(得分:3)

typedef short int(SPTR)[2];

SPTR定义为两个short int的数组。

SPTR *p, *q;

pq定义为指向两个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*。如果没有明确的强制转换,上面的分配就会失败。

之后的其他事情很难理解。它属于未定义行为的类别。