我之前在C中看过这个:
#define MY_STRING "12345"
...
#define SOMETHING (MY_STRING + 2)
在这里,SOMETHING扩展到了什么?这甚至合法吗?或者他们是这个意思吗?:
#define SOMETHING (MY_STRING[2])
答案 0 :(得分:81)
字符串文字存在于程序的固定数据段中,因此它们在编译器中显示为一种指针。
+-+-+-+-+-+--+
|1|2|3|4|5|\0|
+-+-+-+-+-+--+
^ MY_STRING
^ MY_STRING + 2
答案 1 :(得分:20)
当您有数组或指针时,p+x
相当于&p[x]
。所以MY_STRING + 2
等同于&MY_STRING[2]
:它产生字符串中第三个字符的地址。
注意添加0时会发生什么。MY_STRING + 0
与&MY_STRING[0]
相同,因为字符串引用只不过是一个指针,因此它们只与写MY_STRING
相同到字符串中的第一个字符。令人高兴的是,身份操作“添加0”是一个无操作。考虑一下这种心理单元测试,我们可以用它来检查我们关于+
意味着什么的想法是正确的。