Что означает тип параметра void * и что он использует? - PullRequest
5 голосов
/ 20 ноября 2010

Я просматриваю API, написанный на C ++, и я не понимаю, что означает следующий тип параметра:

void*& data

Означает ли это, что пользователь передастссылка на пустой указатель?Если это правда, какой смысл?Я имею в виду, что void * уже перенаправлен, так зачем вам его перенаправлять снова?

Ответы [ 3 ]

7 голосов
/ 20 ноября 2010

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

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

2 голосов
/ 20 ноября 2010

Трудно сказать, не видя его использования, но вы указываете, что ссылка - это уровень косвенности. Вы нашли бы это странным, если бы это был указатель на указатель? Это довольно часто - на самом деле вы имеете дело с ними, когда принимаете аргументы командной строки и получаете указатели на указатели на символы. Другой пример: если вы делаете хеш-карту с использованием сегментов и хотите иметь возможность вернуть указатель на указатель, который запустил блок.

Дело в том, что иногда вам нужно несколько уровней косвенности. Это правда, что смешивание указателей и ссылок может быть странным, но для этого есть веские причины. Одной из распространенных причин является необходимость взаимодействия кода C ++ с C apis. Многие системные вызовы POSIX требуют указателей void, которые передаются, а затем изменяются, поэтому рассматриваемая функция C ++ может выступать в качестве оболочки вокруг этого.

1 голос
/ 20 ноября 2010

Но будьте осторожны, чтобы не вернуть ссылку на локальный void *.Не делай что-то вроде этого:

void*& f()
{
 int* a=new int(10);
 void* x=(void*)a;
 return x;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...