C中关于指针数组的用法

 1 typedef char(*AP)[5];
 2 
 3 AP foo(char *p)
 4 {
 5     for(int i = 0; i < 3; i++)
 6       p[strlen(p)] = 'A';
 7     return (AP)p + 1;
 8 }
 9 
10 int main(void)
11 {
12     char s[] = "FROG\0SEAL\0LION\0LAMB";
13     puts(foo(s)[1] + 2);
14 }

 

结果是:"ONALAMB"

分析过程:typedef char (*AP)[5]; 声明了一个指向类型为char元素个数为5的一维数组。

return (AP)p + 1; 其中(AP)p为强制类型转换,使p转换为指向一维数组的指针,其中的元素个数为5。foo函数返回的地址为:p指向 'S'

foo(s)[1]: 由于返回的类型是AP,相当于强制转换,类似于 (AP)p 将p强制转换为指向一维数组的指针,同样的元素个数为5。p[1] 现在指向了 'L'

最后,由于foo(s)[1] + 2, 再向后移动两个元素,使得p指向了 'O'。

补充:foo函数的作用就是将 s[] 数组中的 '\0' 变成: 'A'.

因此,得到了最后的结果: "ONALAMB"。

posted @ 2017-05-04 14:16  wojiaowoen  阅读(3495)  评论(0编辑  收藏  举报