"12345"+ 2在C中做什么?

Joe*_*Joe 27 c

我之前在C中看到过这个:

#define MY_STRING "12345"
...
#define SOMETHING (MY_STRING + 2)
Run Code Online (Sandbox Code Playgroud)

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

#define SOMETHING (MY_STRING[2])
Run Code Online (Sandbox Code Playgroud)

Ign*_*ams 81

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

+-+-+-+-+-+--+
|1|2|3|4|5|\0|
+-+-+-+-+-+--+
 ^ MY_STRING
     ^ MY_STRING + 2
Run Code Online (Sandbox Code Playgroud)

  • 男人是视觉生物; 如果看起来不错,那一定是对的. (4认同)
  • @Hamish Grubijan:是的,同样适用于Unicode.L"StringLiteral"将具有`const wchar_t*`类型,因此`+`将以`wchar_t`的数量前进. (3认同)
  • 也可以用Unicode执行此操作(使用+符号)吗? (2认同)

Joh*_*ica 20

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

注意当你添加0时会发生什么MY_STRING + 0是相同的&MY_STRING[0],两者都与写入相同,MY_STRING因为字符串引用只不过是指向字符串中第一个字符的指针.令人高兴的是,身份操作"添加0"是一个无操作.考虑一下这种心理单元测试我们可以用来检查我们关于什么+方法的想法是正确的.