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

Указатель на пустоту в С++?

Я читаю некоторый код в Ogre3D, и я не понимаю, что означает переменная типа void *. Что означает указатель на void в С++?

4b9b3361

Ответ 1

Указатель на void, void* может указывать на любой объект:

int a = 5;
void *p = &a;

double b = 3.14;
p = &b;

Вы не можете разыскивать, увеличивать или уменьшать этот указатель, потому что вы не знаете, на какой тип вы указываете. Идея состоит в том, что void* можно использовать для таких функций, как memcpy, которые просто копируют блоки памяти вокруг и не заботятся о типе, который они копируют.

Ответ 2

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

Ответ 3

Это необработанный указатель на пятно в памяти. Он не допускает арифметики указателей, например char * или int *.

Вот несколько примеров использования

http://theory.uwinnipeg.ca/programming/node87.html

Ответ 4

Это указатель на что угодно - только часть памяти, с которой вы можете играть - может быть объектом, может быть char. Вам нужно бросить, чтобы сделать что-нибудь полезное.

Ответ 5

Создание моей предыдущей публикации...


ВНИМАНИЕ: Все адреса памяти здесь вымышлены. Я просто собираю их, чтобы проиллюстрировать точку.


Дано:

int data[] = {10,11,12};

Теперь имеем:

0xffff0000-0xffff0003  with a value of (int)(10)
0xffff0004-0xffff0007  with a value of (int)(11)
0xffff0008-0xffff000b  with a value of (int)(12)

не, чтобы попасть в порядок байтов с бай-ином-байтом).

Если мы имеем:

int * p = data;

Теперь у нас есть другое место в памяти, скажем:

 0xaaaa0000-0xaaaa0003  with a value of (int*)0xffff0000

Мы можем использовать p [1] [или * (p + 1)] для обозначения * (int *) (0xffff0004) [= 11] как sizeof (int) = 4 и 0xffff0000 + sizeof (int) = 0xffff0004.

Если мы имеем:

void * v = data;

Теперь у нас есть другое место в памяти, скажем:

 0xbbbb0000-0xbbbb0003  with a value of (void*)0xffff0000.

Однако, void не имеет связанной информации sizeof(). Мы не можем увеличивать или уменьшать указатель. Мы не можем разыскивать доступ к данным, хранящимся в 0xffff0000. Мы можем использовать значение только как необработанный адрес памяти.

Если мы хотим использовать данные, хранящиеся в (void *) 0xffff0000, сначала нужно привести его к соответствующему типу.

Тем не менее, (void *) по-прежнему весьма полезен как средство передачи адресов произвольным структурам данных. Например, memset(). Не имеет значения, не обнуляю ли я структуру struct tm или struct sockaddr. Нам просто нужен указатель на структуру и ее размер.

(Это, разумеется, не имеет смысла, но... Остерегайтесь использовать memset для обнуления экземпляра класса и при этом перезаписывать таблицу виртуальных указателей.)

Ответ 6

Указатель void не может указывать на член класса в С++.