Когда вы разыменовываете указатель char *
, вы ссылаетесь на один char
объект. Таким образом, это очень похоже на:
char c;
c = size ^ 1;
То есть результирующее значение (в данном случае 11) преобразуется в тип char
и затем сохраняется в местоположении (char *)p + 8
(9-й char
объект, на который указывает p
).
Так что да, это сильно отличается от:
*((int *)p + 2) = size ^ 1;
Последняя строка изменяет весь объект int
, размером sizeof(int)
, и измененный объект является третьим int
объектом, на который указывает p
.
Если мы представим, что у вас система с прямым порядком байтов с sizeof(int) == 4
, то ваши четыре примера изменят память, указанную на p
, следующими способами:
1.
*((char *)p + 8) = size ^ 1;
| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
2
*((int *)p + 2) = size ^ 1;
| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 | ?? | ?? | ?? | ?? |
3
*((char *)p + 3) = size ^ 1;
| ?? | ?? | ?? | 11 | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? |
4
*((int *)p + 3) = size ^ 1;
| ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | ?? | 11 | 00 | 00 | 00 |