Подтвердить что ты не робот

Арифметика пустоты

Учитывая указатель void, если я хочу, чтобы указатель void указывал на x байты вперед, как это будет лучше всего делать? Есть ли лучший способ, чем приведение указателя char?

4b9b3361

Ответ 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*.

Ответ 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)...

Итак, пока вы знаете, что вы делаете, никаких проблем.