Tipo de argumento de función seguido de * &

Tengo algún código escrito por otra persona en el que algunas funciones toman argumentos cuyos tipos de datos van seguidos de un * y. Estoy acostumbrado a las funciones que toman uno u otro, p. tomando un "doble *" o un "doble &" pero no ambos. Hubiera pensado que simplemente se cancelarían.

Aquí hay un ejemplo, y todo esto es de su código que supuestamente funciona:

En un archivo de encabezado hay una función declarada como:

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

uego, en mi archivo principal, hay un puntero a algunos UINT declarados e inicializados como:

unsigned int* pbuff = new UINT[n];

Entonces, la función someClass :: foo se llama como:

foo(pbuff);

Cuando compilo, aparece el error "no se puede convertir el parámetro 1 de 'unsigned int *' a 'const unsigned int * &'". Si cambio mi llamada de función a la siguiente, se compila ok:

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

Entonces, mis preguntas son:

¿Cuál es el propósito de * y? Es decir, ¿cómo es eso diferente de * o & por sí mismos, y por qué no se cancelan solo? ¿Y qué hace que la función foo espere? ¿Una dirección? ¿Un valor? La dirección de una dirección? Es confuso

¿Es la solución simplemente lanzar un "unsigned int *" a un "const unsigned int * &" ok o necesito hacer otra cosa?

Solo otro ejemplo rápido, y esto es completamente dentro de un archivo cpp distribuido por otra persona, así que supongo que esto se compiló para ellos. Tienen una función llamada como

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

Cuando intento compilar, aparece un error "'SLIC :: EnforceLabelConnectivity': no se puede convertir el parámetro 1 de 'int *' a 'const int * &'".

Gracias como siempre

Respuestas a la pregunta(3)

Su respuesta a la pregunta