Предположим, что аргумент int
равен 4 байта.Теперь list_entry
составляет не менее 8 байтов.И все же pList
указывает только на первый из этих 8 байтов.
Теперь, как могут работать все эти выражения?В C (и C ++ в этом отношении) компилятор просматривает все выражение.Член .val2
, вероятно, является 4-байтовым значением с байтовыми смещениями 4-7.Не беспокойтесь о точных деталях, это работа компиляторов.Если вы вставите член между val
и val2
, все будет двигаться, но компилятор все еще отслеживает.
Так что в (*pList).val2
компилятор знает, что нужно добавить 4 байта к pList
и затем принятьследующие 4 байта.
Обратите внимание, что компилятор, как правило, полезен для такого рода математики.pList+1
не добавляет 1 байт, но 1 * sizeof(list_entry)
.