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 SEAL LION LAMB"; 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[] 数组中的 ' ' 变成: 'A'.
因此,得到了最后的结果: "ONALAMB"。