那道腾讯的笔试题的菜鸟解法

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"]);

问:输出什么?
公共主页的做法是反汇编,我觉得没有必要用这么高端的东西,考场上也很难想出这种方法。后来想出一个简单的解法。
由数组与指针的关系知a[1]等价于\*(a+1)即方括号内的是数组名所存地址的偏移值。
所以&a["Hi!Hello"]的含义既是取内存地址为3的内存块,做"Hi!Hello"对应地址的偏移量,再取地址。
设"Hi!Hello"在内存中的地址为s,&a["Hi!Hello"]即等价于&a[s]&*(a+s)a+ss+a&*(s+a)&s[a]&"Hi!Hello"[3]"Hello"
剩下的类推。
所以可以得出结论:
一般地,a[b]<=>*(a+b)<=>*(b+a)<=>b[a]