Ссылка на указатель вряд ли бесполезна. Это делает указатель модифицируемым в вызывающей стороне из вызываемой функции. Обычно не то, что вы хотите, но когда вы делаете, это довольно полезно.

я есть код, написанный кем-то еще, в котором некоторые функции принимают аргументы, типы данных которых сопровождаются * &. Я привык к функциям, принимающим одну или другую, например, принимая "двойной *" или "двойной &", но не оба. Казалось бы, они просто отменили.

Вот пример, и это все из их кода, который предположительно работает:

В заголовочном файле есть функция, объявленная как:

void someClass::foo(const unsigned int*& ubuff);

Затем в моем главном файле есть указатель на некоторые UINT, объявленные и инициализированные как:

unsigned int* pbuff = new UINT[n];

Затем функция someClass :: foo называется:

foo(pbuff);

Когда я компилирую, я получаю сообщение об ошибке «не могу преобразовать параметр 1 из« unsigned int * »в« const unsigned int * & »». Если я изменю свой вызов функции на следующий, он скомпилируется нормально:

foo((const unsigned int *&)(pbuff));

Итак, мои вопросы:

Какова цель * &? То есть, как это отличается от * или & сами по себе, и почему они не просто исключают себя? И что это заставляет функцию foo ожидать? Адрес? Ценность? Адрес адрес? Это сбивает с толку.

Исправлено ли просто приведение "unsigned int *" к "const unsigned int * &" ok или мне нужно сделать что-то еще?

Еще один быстрый пример, и это полностью из файла cpp, распространяемого кем-то другим, поэтому я предполагаю, что это скомпилировано для них. У них есть вызов функции как

klabels = new int[sz];
EnforceLabelConnectivity(klabels, m_width, m_height, nlabels, numlabels, double(sz)/double(STEP*STEP));

Когда я пытаюсь выполнить сборку, я получаю сообщение об ошибке «SLIC :: EnforceLabelConnectivity»: невозможно преобразовать параметр 1 из «int *» в «const int * &» ».

Спасибо как всегда.

Ответы на вопрос(0)

Ваш ответ на вопрос