Увеличивать указатель void на один байт? двумя?
У меня есть указатель на void, называемый ptr
. Я хочу увеличить это значение на несколько байтов. Есть ли способ сделать это?
Обратите внимание, что я хочу сделать это на месте, не создавая никаких переменных.
Могу ли я сделать что-то вроде ptr = (void *)(++((char *) ptr));
?
Ответы
Ответ 1
Вы не можете выполнить арифметику по указателю void, поскольку арифметика указателя определяется с точки зрения размера объекта, на который указывает объект.
Вы можете, однако, направить указатель на char*
, сделать арифметику на этом указателе, а затем преобразовать его обратно в void*
:
void* p = /* get a pointer somehow */;
// In C++:
p = static_cast<char*>(p) + 1;
// In C:
p = (char*)p + 1;
Ответ 2
Никаких арифметических операций не может быть сделано с помощью указателя void
.
Компилятор не знает размер элемента (ов), на который указывает указатель void
. Вы можете наложить указатель на (char *
), чтобы сделать это.
В gcc есть расширение, которое обрабатывает размер a void
как 1
. поэтому можно использовать arithematic на void*
, чтобы добавить смещение в байтах, но с его использованием появился бы не переносимый код.
Ответ 3
Простое увеличение void*
происходит в gcc:
#include <stdlib.h>
#include <stdio.h>
int main() {
int i[] = { 23, 42 };
void* a = &i;
void* b = a + 4;
printf("%i\n", *((int*)b));
return 0;
}
Он концептуально (и официально) ошибочен, поэтому вы хотите сделать его явным: отбросьте его на char*
, а затем обратно.
void* a = get_me_a_pointer();
void* b = (void*)((char*)a + some_number);
Это делает очевидным, что вы увеличиваете количество байтов.
Ответ 4
Вы можете сделать:
++(*((char **)(&ptr)));