2011-01-07 24 views
7

Un puntero que se pasa por referencia. ¿Por qué? no son punteros solo referencias de todos modos? ¿Qué está pasando realmente con este parámetro?Puntero C++ (Pase por referencia) Pregunta

void someFunc(MyPtr*& Object) 
{ 

} 
+1

"¿No son punteros solo referencias de todos modos?" - Hay una ligera ambigüedad aquí. En términos generales de informática, los indicadores son un tipo de referencia.Sin embargo, C++ usa la misma palabra, "referencia", para referirse a una característica específica del idioma. Las referencias de C++ también son un tipo de referencia, pero son un tipo de referencia * diferente, y los punteros no son referencias de C++. –

+0

@ Steve Jessop: +1 razones similares me hicieron escribir mi respuesta también. Ref. V Pointer nice visual doc -> http://www.dgp.toronto.edu/~patrick/csc418/wi2004/notes/PointersVsRef.pdf simplemente parece que siempre causará una gran confusión. Algo similar ocurre en C#, pero mucha gente no se da cuenta de que incluso hay un problema: en realidad es incluso más complejo que C++ en cuanto a pasar por ref y pasar por valor porque tiene capas lógicas sobre los conceptos de C++. Lástima que pocas personas se dan cuenta de que C# es en realidad más complejo que C++ cuando se trata de lo que son "indicadores" (no se trata aquí de código inseguro) – user44298

+0

cont. Pero es muy simple, por otro lado, si lo piensas así: cuando las computadoras almacenan datos (una variable, por ejemplo) los datos solo tienen 2 características: (1) una dirección en memeory y (2) valor escrito en esa dirección . Esa es cualquier información. Punteros y referencias y tales abstracciones introducidas por conveniencia. Cualquier medio que almacene datos como DVD, por ejemplo, es lo mismo que un libro en papel: tienes una página donde tienes una oración escrita; es lo mismo realmente; tienes que escribir la (1) información (2) en alguna parte. Sueños, por otro lado, pueden ser más complejos en lo que respecta al almacenamiento :) – user44298

Respuesta

7

En pocas palabras, le da la capacidad de cambiar el puntero en sí: se puede cambiar para que apunte a otra ubicación en la función. Y el cambio se reflejará en el exterior.

1

Habrá que votar para verificar esta causa porque estoy un poco oxidado en mi C++, pero creo que la idea es pasar un puntero por referencia, es decir, en lugar de crear un nuevo espacio para almacenar el El puntero en sí mismo usa una referencia al puntero, así que si modificara el puntero no solo el valor sería modificado después de regresar de la función, si no, todo lo que podría hacer es modificar el valor en la posición pasada. Espero que tenga sentido .

0

También significa que el puntero puede ser 0 (NULO) que puede tener significado para el método. Una referencia siempre debe ser válida y no puede hacerse 'nada'

1

La diferencia al pasar solo un puntero es que si se cambia el puntero (Object = x), este cambio será visto por la función de llamada. Puede lograr lo mismo cuando pasa MyPtr** Object y desreferencia el puntero *Object = x;. Con el segundo enfoque, podría pasar NULL a la función. Esto no es posible para referencias.

5

Se permiten:

void someFunc(MyPtr*& Object) 
{ 
    //Modify what Object is pointing to 
    Object=&old_Object; 

    //You can also allocate memory, depending on your requirements 
    Object=new MyPtr; 

    //Modify the variable Object points to 
    *Object=another_object; 
} 
+0

¿No tenemos una pérdida de memoria en la situación anterior? – Mahesh

+1

@Mahesh No, siempre que la persona que llama sepa que debe eliminar el nuevo objeto cuando haya terminado con él – trojanfoe

1

Usted no está del todo bien. El puntero contenido se pasa por referencia, pero el puntero en sí aún se pasa por valor, es decir, volver a encontrarlo en algún otro puntero no se reflejará en la salida del método porque el puntero se establecerá para apuntar al mismo bloque de memoria antes de la llamada. Piense en ello como una simple variable int. Sin embargo, con & * o ** puede reasignar el puntero y eso será visible fuera del alcance de este método.

1

¿Por qué?

Por la misma razón que pasaría cualquier otra cosa por referencia.

¿No son indicadores solo referencias de todos modos?

Querido Dios, no. Ni remotamente lo mismo. Mira, puedes probar para construir un modelo mental de una referencia por comenzando con un puntero, pero cuando arreglas todas las diferencias, tienes un lío ilógico horrible.

Las referencias son un concepto mucho más simple e intuitivo, y solo existen "razones históricas" para tratar de comprender los indicadores que tienen ante sí. C++ moderno utiliza punteros sin formato solo en raras ocasiones, y los trata como un detalle de implementación tanto como sea posible.

Una referencia es otro nombre para una cosa ya existente. Eso es. Cuando se usan como un parámetro de función, permiten que la función llamada haga referencia a los datos de la persona que llama.

Cuestiones relacionadas