Exercise 6:阿里巴巴面试题
求下列代码的执行结果
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
答案速查:
分析:
char *a[] = {"work","at","alibaba"};这条代码不是把三个字符串放入a中,而是a指针数组中存放着的地址指向字符串的work首字母w的第一个字节,at首字母a的第一个字节alibaba首字母a的第一个字节
VS2022打开内存输入&a
发现存放的地址0x009a7bcc,0x009a7bd4,0x009a7bd8是连续的,对应三个字符串的首字母的地址
转到地址0x009a7bcc
每一个字符串的结尾都跟着\0
pa的类型是char**,是二级指针(潜台词:二级指针指向一级指针),即pa指向a这个一级指针,一级指针指向字符串的首字母
pa++,二级指针指向a这个指针数组的第二个元素,第二个元素(一级指针)指向第二个字符串的首字母
结果输出at
★(HARD)Exercise 7
求下列代码的执行结果(printf中有表达式过于复杂,→点击查看优先级←)
#include <stdio.h>
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,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;
}
答案速查:
分析:
y由前三行可画:
优先级:++和-- > *(解引用) > +
注意:一次解引用是从指针指向的位置到另一个位置
① printf("%s\n", **++cpp);
由于优先级:++> *(解引用) ,因此cpp先减1再两次解引用(此时cpp的值已经变动!会影响到下一个printf打印的内容)
结果是POINT
② printf("%s\n", *-- * ++cpp + 3);
重点在分析运算顺序!!!
从cpp开始,cpp左侧为++,右侧为+,显然++优先运算,*紧邻++,因此发生一次解引用
③ printf("%s\n", *cpp[-2] + 3);
④ printf("%s\n", cpp[-1][-1] + 1);