2010-06-27 17 views
18
char *str = "Hello"; 

char *ptr = str; 
char *&rptr = str; 

¿Cuál es la diferencia entre ptr y rptr? Entiendo que rptr es una referencia a un puntero (en teoría), pero ¿cómo difiere en términos de implementación con ptr?Referencia a un puntero

¿Las referencias en C++ se implementan usando punteros?

+0

Posibles duplicados: http://stackoverflow.com/questions/57483/difference-between-pointer-variable-and-reference-variable-in-c http://stackoverflow.com/questions/620604/difference- parámetro-entre-un-puntero-y-referencia http: // stackoverflow.com/questions/1948467/about-pointer-and-reference-syntax y probablemente más ... – Alerty

+4

Observe que su código no es válido en aproximadamente un año. Ha quedado obsoleto apuntar a los literales de cadena usando 'char *' durante unos diez años. –

+0

@Johannes: te refieres a que el estándar no permite estos literales de cadena. La mayoría de los libros aún usan esta notación. ¿Dónde puedo obtener una vista previa de tales detalles? – Sam

Respuesta

18

¿Cuál es la diferencia entre ptr y rptr?

Si lo hace char *world = "World"; rptr = world; y luego imprimir str, se imprimirá "Mundial". Si hace ptr = world; y luego imprime str, imprimirá "Hola".

+3

es decir, rptr es un alias de la cadena, ptr es una mera copia. Si apunta a str en otro lugar, afectará a rptr, pero no a ptr. En otras palabras, se podría decir que str y rptr son 2 variables diferentes (2 nombres diferentes), pero el mismo puntero. – apollodude217

+0

Si bien la esencia de su respuesta es correcta, observe que no puede hacer 'rptr =" World "' porque '" World "' no es un puntero 'char *'. La conversión implícita de la matriz char a un puntero char no se realizará aquí, porque es una referencia no constante. –

+0

@ sepp2k todavía está mal. Déjeme arreglar el código para mostrarle lo que está mal. Ahora tiene la misma situación: tiene una matriz, pero intenta vincular una referencia no constante a una 'char *', no funcionará. Es como 'float a = 0; int &r = a; 'falla. Es fácil pasar por alto, pero igual de fácil de entender una vez que vea lo que pasa aquí. –

5

Prueba esto:

#include <iostream> 
int main() { 
    char *str1 = "Hello "; 
    char *str2 = "World!"; 
    char *ptr = str1; 
    char *&rptr = str1; 
    rptr = str2; 
    std::cout << ptr << str1 << std::endl; 
} 

Se imprime "¡Hola mundo!" porque ptr es un puntero de char apuntando al literal de cadena "Hola". rptr es una referencia a un puntero de char, por lo que cuando lo cambie (el puntero, no lo que apunta), cambia str1. Y por lo tanto ptr apunta a "Hola". str1 apunta a "¡Mundo!".

11

str almacena la dirección (y por lo tanto los puntos) en una cadena literal, "Hola", que se almacena en algún lugar en un segmento de solo lectura de la memoria.

ptr apunta a la misma dirección que 'str'.

rptr apunta básicamente a 'str' (no al mismo punto que str, sino a str). Puede ser inusual usar 'puntos a' para las referencias, pero en realidad se parecen mucho a los punteros (en este caso, un puntero a un puntero) excepto con ligeras diferencias sintácticas y la restricción de que no pueden apuntar a ninguna otra dirección durante su toda la vida.

Sería análogo a:

char** const rptr = &str; 

Como una referencia, RPTR anterior no se puede asignar una nueva dirección (no se puede cambiar lo que está señalando), pero puede ser libre de cambiar su pointee (que pasa a ser un puntero en este caso a 'str').

*rptr = 0; // after this, str == 0 

Las referencias son más o menos lo mismo que un puntero de sólo lectura (no un puntero mutable a sólo lectura pointee), sólo que no requieren de un operador de desreferencia para llegar a la pointee (los datos referenciados):

char *str = "Hello"; 
char *&rptr = str; 
rptr = 0; // after this, str == 0 

la única diferencia con el ejemplo anterior con un puntero de sólo lectura al puntero es que no tuvimos que usar el operador *.

referencias const también tienen la propiedad única de poder extender la vida útil de los temporales, pero eso probablemente esté más allá del alcance de la discusión.

Cuestiones relacionadas