Учитывая указатель void
, если я хочу, чтобы указатель void
указывал на x
байты вперед, как это будет лучше всего делать? Есть ли лучший способ, чем приведение указателя char
?
Арифметика пустоты
Ответ 1
Есть ли лучший способ, чем литье a char указатель?
Нет (за исключением того, что для начала используется char *
вместо void *
, поэтому вам вообще не нужно его бросать).
Если это нежелательно или возможно, тогда единственный способ:
ptr = static_cast<char *>(ptr) + offset;
(Примечание: если вы делаете подобные вещи на С++, обычно, существует гораздо лучшее решение. Если вы не являетесь экспертом, и вы уже исключили все другие альтернативы, я предлагаю вам опубликовать новый вопрос, спрашивающий, есть ли лучший способ сделать то, что вы пытаетесь сделать!)
Ответ 2
Учитывая указатель void, если я хочу, чтобы указатель void указывал на x байтов вперед, как это будет лучше всего сделано? Есть ли лучший способ, чем кастинг с указателем char?
Если у вас есть void*
, вы не знаете, что "x bytes ahead" является допустимым адресом. Вы не знаете, что создание такого указателя не приведет к сбою вашей программы.
И поэтому это невозможно сделать с помощью void*
.
Вы можете выполнять арифметику указателей только в указателях в массив. И если у вас есть указатель на массив, вы знаете тип массива и можете использовать эквивалентный тип указателя.
Если вам нужен какой-то абстрактный "указатель на байты" (скажем, если вы используете пул памяти и должны указывать на конкретное смещение в буфер), вы должны использовать char*
или unsigned char*
, а не void*
.
Ответ 3
Взгляните на этот вопрос и на этот вопрос. Подводя итог, следует ответить на char *
для арифметики на уровне байта.
Ответ 4
При выполнении указателя арифметический компилятор хочет принять во внимание то, что он знает о типе, на который указывает указатель.
Например, если у вас есть int *myint
. Тогда эти два утверждения действительно делают одно и то же:
int a = *(myint+5);
и
int a = myint[5];
в этом случае myint+5
не означает "адрес myint плюс 5", но "адрес myint плюс 5 * sizeof (int))"
Поэтому в случае void *
компилятор не может делать никаких предположений, что означает void * + 5
. Поэтому, прежде чем использовать void *, вам нужно указать, как вы хотите его использовать.
Ответ 5
Вот моя проблема
void *inputAudioBuffer;
С++ не позволял мне делать это
UInt16 *inputBuffer = (UInt16 *)(inputAudioBuffer + inputBufferOffset);
после выполнения типа cast я смог это сделать
UInt16 *inputBuffer = (UInt16 *)( (UInt16 *) inputAudioBuffer + inputBufferOffset);
Ответ 6
В отличие от других людей, отвечающих на этот вопрос, мне кажется, что простого +x
(без кастингов вообще) достаточно для доступа к адресу x
байт перед вашим указателем void. Компилятору это может не понравиться, но, по крайней мере, в тех случаях, когда я использовал это, он сработал. Я использую g++
(gcc
)...
Итак, пока вы знаете, что вы делаете, никаких проблем.