estoy leyendo un mensaje el desbordamiento de pila y vi esta función:¿Por qué la gente usa algo como char * y buf?
advance_buf(const char*& buf, const char* removed_chars, int size);
¿Qué significa aquí char*& buf
y por qué la gente lo usa?
estoy leyendo un mensaje el desbordamiento de pila y vi esta función:¿Por qué la gente usa algo como char * y buf?
advance_buf(const char*& buf, const char* removed_chars, int size);
¿Qué significa aquí char*& buf
y por qué la gente lo usa?
Significa buf
es una referencia a un puntero, por lo que se puede cambiar su valor (así como el valor del área a la que apunta).
estoy bastante rancio en C, pero que yo sepa no hay referencias en C y este código es C++ (tenga en cuenta la cuestión fue originalmente marcada c).
Por ejemplo:
void advance(char*& p, int i)
{
p += i; // change p
*p = toupper(*p); // change *p
}
int main() {
char arr[] = "hello world";
char* p = arr; // p -> "hello world";
advance(p, 6);
// p is now "World"
}
Editar: En los comentarios @brett preguntará si puede asignar NULL
-buff
y si es así ¿dónde está la ventaja de utilizar una referencia sobre un puntero. Estoy poniendo aquí la respuesta para una mejor visibilidad
Puede asignar
NULL
-buff
. No es un error Lo que todos dicen es que si usastechar **pBuff
, entoncespBuff
podría serNULL
(de tipochar**
) o*pBuff
podría serNULL
(de tipochar*
). Cuando se usachar*& rBuff
, entoncesrBuff
puede seguir siendoNULL
(del tipochar*
), pero no hay ninguna entidad con el tipochar**
que puede serNULL
.
¿por qué las personas usan algo como esto? ¿Hay alguna ventaja de usar esto? Creo que usar char ** buf también funciona ¿verdad? para proporcionar una interfaz limpia? – brett
eso, y los punteros pueden apuntar a basura o a NULL, pero las referencias son siempre válidas. –
Es más limpio codificar utilizando referencias que punteros, pero debajo de las cubiertas es básicamente el mismo carácter ** que char * &. – ggarber
buf
's a (C++) referencia a un puntero. Puede tener un const char *foo
en la función llamando al advance_buf
y ahora advance_buf
puede cambiar el puntero foo
, cambios que también se verán en la función de llamada.
Tenga en cuenta que esto es específico de C++ y sin sentido en C. Es posible que desee cambiar la etiqueta. –
Cambió la etiqueta a "C++", ya que C no tiene referencias. –
Un [libro] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) le brindará un conjunto de información mucho más completo que si lo recogiera en Internet. – GManNickG