特殊的C语言数组表达方式
特殊的C语言数组表达方式
先来看一段代码:
1 |
|
你觉得这段程序会打印出什么? s
,确实是 s
。原因很简单,因为 s
是字符串 “abcdssdc”
的第 5
个字符。并且其类型是char*
类型,是一个指针。我们把这个程序转换一下:
1 |
|
现在应该清楚了。这种奇怪的写法其实是利用了,在 C 语言中, ‘[]’
操作符里外可以互换。一个数组表达式 “a[5]”
,可以写成 “5[a]”
。在编译器看来,这两种写法最后都会翻译成 “*(a+5)”
。更进一步,只要表达式 “x[y]”
中, x
和 y
可以进行加法运算,且运算后的结果可以正常作为一个地址被引用,那这种写法就是合法的,且编译器不会报任何错误。
但是,回过头来,这种写法在正常的程序中有用吗?个人感觉没有多大的实用价值,但是说不定会在 Obfuscated C Contest
中有用 :)
总结:在C语言中的数组,在a[b]
只要是指针和数字的结合就是正确的,或者认为对于任何两个表达式 a
和 b
,只要其中一个是指针表达式,一个是整型。二者就可以互换位置
以上就是为什么5["abcdssdc"]
可以打印出s
的原因了
参考资料
特殊的C语言数组表达方式
https://ysc2.github.io/ysc2.github.io/2024/04/19/特殊的C语言数组表达方式/