“12345”+ 2在C中做什么?

我之前在C中看过这个

#define MY_STRING "12345" ... #define SOMETHING (MY_STRING + 2) 

在这里,SOMETHING扩展到了什么? 这甚至合法吗? 或者他们是这个意思?:

 #define SOMETHING (MY_STRING[2]) 

字符串文字存在于程序的固定数据段中,因此它们在编译器中显示为一种指针。

 +-+-+-+-+-+--+ |1|2|3|4|5|\0| +-+-+-+-+-+--+ ^ MY_STRING ^ MY_STRING + 2 

当你有一个数组或指针时, p+x相当于&p[x] 。 所以MY_STRING + 2相当于&MY_STRING[2] :它产生字符串中第三个字符的地址。

注意添加0时会发生什么MY_STRING + 0&MY_STRING[0] ,两者都与编写MY_STRING相同,因为字符串引用只不过是指向字符串中第一个字符的指针。 令人高兴的是,身份操作“添加0”是一个无操作。 考虑一下这种心理unit testing,我们可以用它来检查我们关于+均值是正确的想法。