¿Qué hace “12345” + 2 en C?

He visto esto hecho en C antes:

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

¿A qué se amplía ALGO, aquí? ¿Es esto incluso legal? ¿O quieren decir esto ?:

 #define SOMETHING (MY_STRING[2]) 

Los literales de cadena existen en el segmento de datos fijos del progtwig, por lo que aparecen al comstackdor como un tipo de puntero.

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

Cuando tienes una matriz o un puntero, p+x es equivalente a &p[x] . Entonces, MY_STRING + 2 es equivalente a &MY_STRING[2] : produce la dirección del tercer carácter en la cadena.

Observe lo que sucede cuando agrega 0. MY_STRING + 0 es lo mismo que &MY_STRING[0] , ambos son lo mismo que escribir simplemente MY_STRING ya que una referencia de cadena no es más que un puntero al primer carácter de la cadena. Afortunadamente, entonces, la operación de identidad “agregar 0” no es una operación. Considere este tipo de prueba de unidad mental que podemos usar para verificar que nuestra idea sobre lo que significa + es correcta.