Вопрос

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

Это было полезно?

Решение

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

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

double b = 3.14;
p = &b;

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

Другие советы

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

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

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

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

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

Отталкиваясь от моего предыдущего поста...


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


Данный:

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 ++.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top