Добавление смещения к указателю - PullRequest
7 голосов
/ 27 августа 2011

Если у меня есть указатель на объект и я хочу получить указатель на объект, скажем, 16 байтов после указателя, как мне добавить 16-байтовое смещение к указателю?

Кроме того, адреса памяти в 32-битных системах выглядят так: 0x00000000. Если я поменяю адрес, например, 0x00000001 на 0x00000002, сколько байтов будет пропущено?

Ответы [ 3 ]

9 голосов
/ 27 августа 2011

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

T * p  = get_pointer();

char * cp = reinterpret_cast<char*>(p);

cp += 16;

Приведение указателей к типам символов и из них не является указанием типа и явно разрешено стандартом. Однако вы не должны использовать результирующий указатель для доступа к объектам, которые на самом деле не находятся по этому адресу.

2 голосов
/ 27 августа 2011

Если у меня есть указатель на объект и я хочу получить указатель на объект, скажем, 16 байтов после указателя, как мне добавить 16-байтовое смещение к указателю?

Приведение через char* будет работать, но это может считаться плохой практикой в ​​зависимости от деталей вашего сценария:

T *ptr = initialize_ptr(); // Do whatever initialization you need to.

ptr = (T*)(((char*)ptr) + 16);

Кроме того, адреса памяти в 32-битных системах выглядят так: 0x00000000. Если я поменяю адрес, например 0x00000001, на 0x00000002, сколько байтов будет пропущено?

Разница между 2 и 1 равна 1 - будет пропущен ровно один байт.

1 голос
/ 27 августа 2011

Вы бы сделали это:

char *arr = (char*)((void*) ptrToSomeObject);
&arr[15]

Что происходит под капотом

  1. Любой ptr может быть преобразован в 'void *'
  2. 'void *' может быть преобразован в любой тип ptr.
  3. arr [15] == (arr + 15 байтов)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...