Referencia a un puntero

char *str = "Hello";

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

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

Son referencias en C++ implementa el uso de punteros?

  • Posibles duplicados: stackoverflow.com/questions/57483/… stackoverflow.com/questions/620604/… stackoverflow.com/questions/1948467/… y, probablemente, más…
  • Aviso el código no válido en aproximadamente un año. Ha sido obsoleto a punto de literales de cadena utilizando char* por cerca de diez años.
  • Quiere decir que la norma no permite que esos literales de cadena. La mayoría de los libros todavía el uso de esta notación. Donde puedo tener una vista previa de estos detalles?
  • El estándar de C++ utiliza para listar el desuso de la unión de los literales de cadena a char* en la sección D4. El C++0x FCD no contiene una entrada más, que supongo que significa que el enlace ya no está más en desuso, pero ahora ilegales, como Johannes señalado correctamente 🙂
  • La parte importante es que si quieres a punto en un literal de cadena, utilice un const char*. Que siempre ha sido y seguirá siendo legal.
InformationsquelleAutor Sam | 2010-06-27

3 Kommentare

  1. 17

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

    Si usted char *world = "World"; rptr = world; y, a continuación, imprimir str, se imprimirá «Mundo». Si usted ptr = world; y, a continuación, imprimir str, se imprimirá «Hola».

    • es decir, rptr es un alias cadena, ptr es una mera copia. Si el punto de str en algún otro lugar, va a afectar rptr, pero no ptr. En otras palabras, se podría decir que la str y rptr son 2 diferentes variables (2 nombres diferentes), pero el mismo puntero.
    • Mientras que de hecho, la esencia de su respuesta es correcta, observe que no se puede hacer rptr = "World" porque "World" no es un char* puntero. La conversión implícita de la matriz de char a char puntero no debe hacerse, porque es una referencia no const.
    • todavía es malo. Voy a corregir el código para mostrar lo que está mal. Ahora tienes la misma situación: tienes un array, pero intenta enlazar un no-const referencia a un char* a ella – no va a funcionar. Es como float a = 0; int &r = a; falla. Es fácil pasar por alto, pero igual de fáciles de entender una vez que usted vea lo que está aquí.
    • Mi editada código se compila en g++ con la Pared -pedante -ansi sin previo aviso. Tenga en cuenta que no estoy haciendo char*& something = anArray;, estoy haciendo char*& something = aPointer; something = anArray;.
    • ohh veo ahora. Lo siento por ser tan estúpido. Incluso he intentado con codepad.org antes de comprobar, pero estoy totalmente perdido que esto es realmente sólo una tarea. Puedes conseguir otra taza de café ahora. Saludos!
    • ¿Cuál es el significado de esta declaración char*& algo = aPointer; algo = anArray; estás haciendo esto porque no se puede directamente de un punto a a un literal de cadena (es decir, «Hola») utilizando char* directamente por la norma.
    • str no cambia, como lo es en la memoria de sólo lectura.
    • se almacena en la memoria de sólo lectura (o más bien escribir a causa de la UB, por lo que puede se almacenan en la memoria de sólo lectura). str es ya sea de forma local o global de la variable (dependiendo de la OP del código se encuentra) y no declarado const. Así que definitivamente no se almacenan en la memoria de sólo lectura (a menos que el compilador puede demostrar que la variable nunca escrito, lo cual es imposible en este caso, ya que estamos escribiendo para ella).
    • pero si podemos cambiar str, a continuación, la pérdida de memoria aparece. «Hola» se encuentra en algún lugar, entonces cambiamos la dirección donde str puntos. Perdemos la dirección de «Hola». Te refieres a que la localización de «Hola» en la Rom o no es dependiente del compilador? Y por la especificación de la nada está mal con el cambio de str? Y ¿qué significa OP?
    • No es como usted puede free literales de cadena, por lo que la memoria es «filtrado» de cualquier manera. Sí, es el compilador para decidir si desea o no guardar los literales de cadena en una sección de sólo lectura de la memoria. No todas las plataformas soportan, incluso, de protección de memoria, así que sería una mala idea para el estándar de hacer suposiciones acerca de eso. Y sí, es perfectamente legal según el estándar para asignar a str – es sólo una variable como cualquier otra.

  2. 12

    str almacena la dirección (y por lo tanto puntos) a un literal de cadena «Hola», que es almacenado en algún lugar de sólo-lectura segmento de memoria.

    ptr puntos a la misma dirección ‘str’.

    rptr básicamente los puntos a ‘str’ (no a la misma pointee como str, pero a la str en sí). Podría ser inusual el uso de ‘puntos’ por referencias, pero son realmente muy parecida a la de los punteros a sí mismos (en este caso un puntero a un puntero), salvo ligeras diferencias sintácticas y la restricción de que no puede apuntar a cualquier otra dirección durante su vida.

    Sería análogo a:

    char** const rptr = &str;

    Como una referencia, rptr de arriba no se puede asignar una nueva dirección (no se puede cambiar lo que está apuntando a), pero puede ser libre para cambiar su pointee (que pasa a ser un puntero en este caso a ‘str’).

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

    Referencias son prácticamente los mismos como de sólo-lectura de puntero (no mutables puntero de sólo lectura pointee) sólo que no requieren de eliminar del operador para llegar a la pointee (los datos de referencia):

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

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

    const referencias también tiene la propiedad única de ser capaz de extender la vida útil de empleos temporales, pero que probablemente fuera del alcance de la discusión.

  3. 5

    Intente 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 tipo de puntero que apunta a la cadena literal «Hola «. rptr es una referencia a un puntero char, por lo que al cambiarlo (el puntero, y no lo señala.) cambiar str1. Y así ptr puntos a «Hola «. str1 puntos al «Mundo!».

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea