Точка оператора на указатель на структуру - PullRequest
0 голосов
/ 19 сентября 2019

Допустим, у меня есть структура

typedef struct list_entry {
    int val;
    int val2;
} list_entry;

и указатель на нее

list_entry list;
list_entry* pList = &list;

Тогда почему (*pList).val2 дает мне значение, хранящееся в list.val2, если*pList возвращает значение по адресу, хранящемуся в pList, а поскольку pList содержит адрес списка, *pList должен возвращать число, сохраненное в val?Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Предположим, что аргумент 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).

0 голосов
/ 19 сентября 2019

Вы правы.*pList должен дать вам значение по адресу, хранящемуся в pList.Но тип значения list_entry.*pList вернул вам значение типа list_entry и (*pList).val2 - это поле val2 в этом list_entry.

Теперь, если вы читаете значение в *pList как int, тогдавы получите значение поля val.
например, *((int*)pList)
TLDR: *pList возвращает значение по адресу, хранящемуся в pList, но тип значения определяется типом *pList.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...