Указатель на void в C ++?
-
03-07-2019 - |
Вопрос
Я читаю кое-какой код в Ogre3D реализация, и я не могу понять, что такое void *
тип переменной означает.Что означает указатель на void
имеете в виду на C ++?
Решение
Указатель на void, void *
может указывать на любой объект:
int a = 5;
void *p = &a;
double b = 3.14;
p = &b;
Вы не можете разыменовать, увеличивать или уменьшать этот указатель, потому что вы не знаете, на какой тип вы указываете. Идея состоит в том, что void *
можно использовать для таких функций, как memcpy
, которые просто копируют блоки памяти и не заботятся о типе, который они копируют. Р>
Другие советы
Это просто общий указатель, используемый для передачи данных, когда вы не знаете тип. Вы должны привести его к правильному типу, чтобы использовать его.
Это необработанный указатель на место в памяти. Он не позволяет использовать арифметику указателей, например, char * или int *. Р>
Вот несколько примеров использования
Это указатель на что-нибудь - просто кусок памяти, с которым вы можете играть - может быть объектом, может быть символом. Вы должны сыграть что-нибудь полезное с ним.
Отталкиваясь от моего предыдущего поста...
ВНИМАНИЕ: Все адреса памяти здесь вымышлены.Я просто выдумываю их, чтобы проиллюстрировать одну мысль.
Данный:
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)
(I'm нет здесь я собираюсь перейти к порядку байтов в формате big-endian и little-endian.)
Если у нас есть:
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().Не имеет значения, обнуляю ли я структура tm или структура sockaddr.Нам просто нужен указатель на структуру и ее размер.
(Это само собой разумеется, но...Остерегайтесь использования memset для обнуления экземпляра класса и, при этом, перезаписи таблицы виртуальных указателей.)
Пустой указатель не может указывать на члена класса в C ++.