2012-08-07 16 views
6

¿Cuál de los siguientes es incorrecto, por favor?En C++ punteros y referencias, se necesita aclaración

Tengo entendido que un puntero representa una dirección de algo de algún tipo.

Así, int i = 18, un puntero a ella es int *pI = &i;

Los siguientes 2 declaraciones son válidas

void foo (int &something) // Will accept an address of something 
void bar (int *something) // Will accept a pointer to something 

Cuando declaramos una función como

void bar (int *something) 

mejor que nos enviamos un puntero a alguna cosa. De hecho, foo(pI) funciona.

Siguiendo la misma lógica, cuando se mira en

void foo (int &something) 

debemos enviar una dirección de algo que apunta a un int como argumento, por lo que a continuación:

¿Por qué es foo(&i) mal?

Respuesta

5

void foo (int &something) // Will accept an address of something

Esto es incorrecto: int& es una referencia, un concepto que es similar a los punteros en ciertos aspectos, pero no en todos idénticos.

Las referencias son similares a los punteros en el sentido de que un valor se puede cambiar a través de una referencia, al igual que se puede cambiar a través de un puntero. Sin embargo, no existe tal cosa como "referencia nula", mientras que los punteros NULL son muy comunes.

Cuando se llama a una función que toma una referencia, simplemente pasa la variable de la referencia a la que está tomando - no se requiere & operador:

void foo (something); // "something" must be a variable 
2

La declaración void foo (int &something) toma un reference variable, no un puntero .

usted lo llama exactamente igual que ustedes llamarían void foo (int something), excepto que es somethingpassed by reference, no by value.

0

void foo (int & algo) // aceptará una dirección de algo

No, aunque puedo comprender la confusión. Esa función toma una referencia a int. Se garantiza que las referencias no son nulas en un programa bien definido. Es conceptualmente similar a un puntero, pero semánticamente diferente.

Para llamar a esa función, no necesita hacer nada especial.

int i = 10; 
foo(i); // passed to foo by reference 
0

Debido a que en C++ la & significa "tipo de referencia" en el contexto de un prototipo de función que se utiliza aquí. Su función:

void foo (int &something) 

es en realidad especificando que un tipo de referencia entero se debe pasar, por lo que sólo tendría que llamar a esta función como esta:

foo(i); 

Nótese que en este caso está todavía pasando la dirección de i en la función, pero lo está haciendo como un tipo de referencia en lugar de un puntero sin formato.

0

Hay dos significados diferentes para &.

El primero es crear un puntero a partir de una variable existente.

El segundo es hacer una referencia.

Aunque ambos usan el mismo personaje, son dos cosas completamente diferentes.

Cuestiones relacionadas