Добавить смещение к указателю без приведения к UINT - PullRequest
0 голосов
/ 31 декабря 2018

Если вы написали следующий код, чтобы немного узнать об указателях и арифметике указателей, что означает переход от смещения к смещению для чтения чего-либо из структуры.У меня есть следующий код

    DWORD * x = (DWORD*)((UINT)ptr1 + sizeof(int) + sizeof(float));
    float f = *(float*)x;

Этот код работает как следует.Однако я изо всех сил пытался заставить его работать, так как вначале я не приводил ptr1 к UINT и, следовательно, получал другой адрес, как я хотел.

Теперь это работает.Однако кто-то может объяснить мне, почему я не могу добавить смещение (sizeof...) к ptr1 напрямую, которое имеет тип DWORD *?

DWORD * x = (DWORD*)(ptr1 + sizeof(int) + sizeof(float));
float f = *(float*)x;

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

переход от смещения к смещению для чтения чего-либо из структуры.

Вы не можете этого сделать.Это не так, как работают указатели.Вы не должны относиться к ним как к просто числам, адресам;так лежит безумие.C ++ - это абстракция, и вы можете иметь только указатель на объект или массив объектов.Как только вы начнете играть с ним, чтобы перемещаться между объектами, вы потеряли.Приготовьтесь к странностям UB, связанным с отступами, выравниванием, наложением, оптимизацией ...

0 голосов
/ 31 декабря 2018

Добавление числа n к указателю T * переместит указатель sizeof(T)*n байтов (не n байтов).

Для вашего примера, если мы предположим, что оба sizeof(int) иsizeof(DWORD) равны 4, добавление sizeof(int) к ptr1 переместит ptr1 16 байт (вместо 4, что вы, вероятно, предполагали).

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