2010-08-08 12 views
6

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?

+3

Tenga en cuenta que esto es específico de C++ y sin sentido en C. Es posible que desee cambiar la etiqueta. –

+1

Cambió la etiqueta a "C++", ya que C no tiene referencias. –

+1

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

Respuesta

13

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

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 usaste char **pBuff, entonces pBuff podría ser NULL (de tipo char**) o *pBuff podría ser NULL (de tipo char*). Cuando se usa char*& rBuff, entonces rBuff puede seguir siendo NULL (del tipo char*), pero no hay ninguna entidad con el tipo char** que puede ser NULL.

+0

¿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

+0

eso, y los punteros pueden apuntar a basura o a NULL, pero las referencias son siempre válidas. –

+0

Es más limpio codificar utilizando referencias que punteros, pero debajo de las cubiertas es básicamente el mismo carácter ** que char * &. – ggarber

4

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.

Cuestiones relacionadas