After preprocessing, your snippet looks like
char * my_id = "28";
so, my_id
points to the string literal "28"
.
For string literals, it basically is a null terminated character array with static
storage duration. But, attempt to modify a(ny) string literal causes undefined behavior.
Quoting C11
, chapter §6.4.5, String literals, paragraph 6,
In translation phase 7, a byte or code of value zero is appended to each multibyte
character sequence that results from a string literal or literals.78) The multibyte character
sequence is then used to initialize an array of static storage duration and length just
sufficient to contain the sequence. For character string literals, the array elements have
type char, and are initialized with the individual bytes of the multibyte character
sequence. [...]
and paragraph 7,
[...] If the program attempts to modify such an array, the behavior is
undefined.
So, TL:DR, my_id
points to the string literal, or for the sake of accuracy, it holds the address of the first element of the null-terminated array with static storage, initialized with the content "28"
.