Я читаю некоторый код в Ogre3D, и я не понимаю, что означает переменная типа void *
. Что означает указатель на void
в С++?
Указатель на пустоту в С++?
Ответ 1
Указатель на void, void*
может указывать на любой объект:
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
Вы не можете разыскивать, увеличивать или уменьшать этот указатель, потому что вы не знаете, на какой тип вы указываете. Идея состоит в том, что void*
можно использовать для таких функций, как memcpy
, которые просто копируют блоки памяти вокруг и не заботятся о типе, который они копируют.
Ответ 2
Это просто общий указатель, используемый для передачи данных, когда вы не знаете тип. Вы должны использовать его для правильного типа, чтобы использовать его.
Ответ 3
Это необработанный указатель на пятно в памяти. Он не допускает арифметики указателей, например char * или int *.
Вот несколько примеров использования
Ответ 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 не может указывать на член класса в С++.