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

时间:2010-08-25 22:20:50

标签: c

我之前在C中看过这个

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

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

#define SOMETHING (MY_STRING[2])

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”是一个无操作。考虑一下这种心理单元测试,我们可以用它来检查我们关于+意味着什么的想法是正确的。