TimothyQiu's Blog

keep it simple stupid

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 个元素的值(前提是 arrayindex 两者中有且只有一个指针,否则该表达式无效)。所以 array[index]index[array] 其实没什么两样。

那么,既然 C 语言字符串本质是字符数组的首地址,3 + "Hi!Hello" 就是一个指向字符串3号元素的字符指针,传给 printf 即从第4个字符开始输出到 '\0'

所以说,这道面试题其实是非常巧妙的基础题。但悲催的是,那篇日志下的评论不少是“考这个有鸟用”、“TX就会这种傻逼题”、“考这么偏的点”,真是让人感到悲哀……

C

已有 2 条评论 »

  1. 这明显是吃饱了撑的啊, 你拿这个试试多维数组?
    有一届混乱 C 语言程序大赛的得奖作品利用了这特性.
    http://www.ioccc.org/1984/anonymous.c

    1. 嘛~不指望面试题考真正写东西的时候会用到的东西~
      多维数组其实也可以,只不过要用强制类型转换,维持不了 arrayindexA 的外观…… printf( &((char const *)(&3["wxyzHello"]))[1] );
      话说那个混乱代码……貌似开语法高亮看的话还是比较好认的 =。=

添加新评论 »