那道腾讯的笔试题的菜鸟解法
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+s
即s+a
即&*(s+a)
即&s[a]
即&"Hi!Hello"[3]
即"Hello"
。
剩下的类推。
所以可以得出结论:
一般地,a[b]<=>*(a+b)<=>*(b+a)<=>b[a]