一道小有难度的指针笔试题
int main() {
char* c[] = { "PEOPLE","MATH","HOUSE","COURSE"};
char** cp[] = { c + 2,c + 3,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *-- * ++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
return 0;
}
分析这道题时,首先画出内存布局。
首先根据第一行代码,我们可以确认创建了一个指针数组,将首字符的地址存放了进去。
第二行是一个二级指针数组,对之前的一级指针数组首元素进行重新指向
第三行的三级char类型指针指向二级指针数组的首元素地址、
如下图所示:
第一个输出,我们++cpp改变了cpp的指向,第一次解引用拿到C+3的内容,第二次解引用拿到了COURSE空间的内容,%s打印,输出COURSE。
第二个输出:++CPP,改变CPP的指向,解引用一次,拿到C+1的内容,前置–改变了C+1的内容,称为C也改变了指向,第二次解引用指向了PEOPLE的首地址,+3前后移动3次,%s输出了PLE。
第三个输出*CPP【-2】+3相当于* *(CPP+2)-3,先将CPP向前移动两个位置,解引用拿到C+2的内容,再次解引用地址加3移动到S%s打印SE。
第四个输出CPP[-1][-2]+1相当于,*(*(CPP-1)-1),之前CPP+2指向C+2,同理,C-1指向C+3解引用拿到C+3的内容,C+3-2 为C+1即指向M,+1表示指针往后移动一位,%s输出ATH