下述程序的输出是______。
#include<stdio.h> int main() { static char *s[] = {"black", "white", "pink", "violet"}; char **ptr[] = {s+3, s+2, s+1, s}, ***p; p = ptr; ++p; printf("%s", **p+1); return 0; }
char **ptr[] 是一个还是一个指针数组,不过是一个二级指针数组,存的是s这个数组中,每个元素的地址 p是一个三级指针,ptr这个二级指针数组的数组名也是一个三级指针, p++只是往后跳了一个元素的位置,*p就是第二个元素的内容,也就是指向s数组中s+3这个元素的地址, **p就得到了s数组中s+3这个元素的内容, s数组中保存的是字符串的首地址,那就得到了"pink"这个元素的首地址, 在**p+1就是这个地址向后偏移一个字节,也就指到了'i'上, 所以 %s, **p+1还是"ink"
代码中定义了一个静态字符指针数组s,其中包含四个字符串。然后定义了一个指向字符指针的指针数组ptr,其中存储了s数组中各元素的地址,但是顺序颠倒了。
最后声明了一个指向指针数组的指针p,并将其初始化为ptr的地址。接着将p的值加一,使其指向第二个指针数组元素。
在打印printf语句中,使用了间接寻址运算符**p来访问ptr数组中第二个元素,即指向s+2的指针。由于**p实际上是*(*p),因此我们得到了指向s+2的指针s[2]。
然后,使用+1运算符访问字符串"pink"的第二个字符,即'i',并将其作为一个字符串打印出来。因此输出结果是ink。