String as Array Index
分类:技术
标题用中文写觉得比较怪(用字符串作为数组下标),那就写英文吧~
话说前几天人人网 C 语言公共主页发了篇日志,内容是腾讯的面试题:
int a = 3, b = 5;
printf(&a["Hi!Hello"],&b["fun/super"]);
printf("%c%c%c%c",1["wst"],2["www"],0["ddd"],5["ewewrew"]);
这段代码应该输出什么呢?答案是应该输出:
Helloswde
主页君说没遇到过这类语法,于是把编译后的程序反汇编了说明为什么是这个答案。
但事实上,类似 a["Hi!Hello"]
的语法和普通数组 a[3]
的用法并没有什么两样。
我们知道,C 语言的数组直接对应一片连续的内存,数组名代表起始地址,要访问数组元素就要用方括号中的表达式代表该元素的偏移量。类似 array[index]
的表达式实际上等价于
*(array + index)
由于指针算术(Pointer Arithmetic)的关系,表达式可以正确得到 array 指针向后指 index 个元素的值(前提是 array
和 index
两者中有且只有一个指针,否则该表达式无效)。所以 array[index]
和 index[array]
其实没什么两样。
那么,既然 C 语言字符串本质是字符数组的首地址,3 + "Hi!Hello"
就是一个指向字符串3号元素的字符指针,传给 printf
即从第4个字符开始输出到 '\0'
。
所以说,这道面试题其实是非常巧妙的基础题。但悲催的是,那篇日志下的评论不少是“考这个有鸟用”、“TX就会这种傻逼题”、“考这么偏的点”,真是让人感到悲哀……
这明显是吃饱了撑的啊, 你拿这个试试多维数组?
有一届混乱 C 语言程序大赛的得奖作品利用了这特性.
http://www.ioccc.org/1984/anonymous.c
嘛~不指望面试题考真正写东西的时候会用到的东西~
多维数组其实也可以,只不过要用强制类型转换,维持不了 arrayindexA 的外观…… printf( &((char const *)(&3["wxyzHello"]))[1] );
话说那个混乱代码……貌似开语法高亮看的话还是比较好认的 =。=