C ++ 丨 ¿Cuál es la diferencia entre pasar por referencia y pasar por puntero? Recibí una oferta de Dachang

Este artículo presenta principalmente la diferencia entre el paso de referencias y el paso de punteros en C ++ (común en las entrevistas). Los amigos que lo necesiten pueden consultarlo.

Durante la entrevista, muchos entrevistadores hicieron una pregunta, ¿cuál es la diferencia entre pasar por referencia y pasar por puntero en C ++? Mucha gente debería pensar en la función swap, solo saben que se puede implementar por referencia o por puntero, en cuanto a la diferencia entre las dos, realmente no la he considerado. Después de recopilar información en Internet, lo resolví yo mismo.

 

 Reglas citadas: 

(1) La referencia debe inicializarse cuando se crea (el puntero se puede inicializar en cualquier momento). 

(2) No puede haber una referencia NULL y la referencia debe estar asociada con una unidad de almacenamiento legal (el puntero puede ser NULL). 

(3) Una vez que se inicializa la referencia, la relación de la referencia no se puede cambiar (el puntero puede cambiar el objeto puntiagudo en cualquier momento).

La esencia de la transferencia de puntero:

El parámetro de paso de puntero es esencialmente una forma de paso de valor, lo que pasa es un valor de dirección. En el proceso de transferencia de valor, los parámetros formales de la función llamada se tratan como variables locales de la función llamada.

Es decir, se abre un espacio de memoria en la pila para almacenar el valor del parámetro real introducido por la función de llamada, que se convierte en una copia del parámetro real. La característica de la transferencia de valor es que la función modulada

Cualquier operación se realiza como una variable local y no afectará el valor de la variable de parámetro real de la función de llamada. (Aquí se dice que el valor de la dirección del puntero del parámetro real no cambiará)

El paso de puntero y el paso de referencia se aplican generalmente a:

Modifique los parámetros dentro de la función y espere que los cambios afecten a la persona que llama. El paso de puntero de contraste / referencia puede "pasar" cambios de parámetros formales a parámetros reales (de hecho, se modifica directamente en la memoria del parámetro real,

A diferencia de la transferencia de valores, el valor real del parámetro se copia a otra dirección de memoria antes de la modificación).

Otro uso es: cuando una función realmente necesita devolver múltiples valores, pero solo puede devolver un valor explícitamente, puede pasar las otras variables que deben ser devueltas por puntero / referencia

A una función, de modo que después de que la función se modifica y se devuelve, el llamador puede obtener la variable modificada, que es equivalente a una transferencia de valor de retorno implícito.

 

Entonces, ¿hay alguna diferencia entre pasar por referencia y pasar por puntero?

Lite:

Puntero: variable, independiente, variable, anulable, suplente, sin verificación de tipo;

Referencia: alias, dependencia, sin cambios, no vacío, ontología, verificación de tipos;

versión completa:

1. Concepto

  El puntero es esencialmente una variable, el valor de la variable es la dirección de otra variable, el puntero es lógicamente independiente, se puede cambiar, incluido el valor de la variable del puntero (la dirección a la que apunta) y el valor correspondiente del puntero variable Los datos en la memoria (los datos almacenados en la dirección apuntada).

  Una referencia es esencialmente un alias, un sinónimo de otra variable, no es lógicamente independiente, su existencia es dependiente, por lo que la referencia debe inicializarse al principio (la variable, este objeto, este Solo los objetos físicos pueden tener alias), y los objetos referenciados no se pueden cambiar durante todo su ciclo de vida, es decir, solo se pueden adjuntar a la misma variable de principio a fin (el alias del cual se representa en el momento de la inicialización siempre será cuyo alias, y no se puede cambiar .).

2. Paso de parámetro de puntero y paso de parámetro de referencia en C ++

  La transferencia de parámetros de puntero es esencialmente una transferencia de valor, lo que transfiere es un valor de dirección. En el proceso de transferencia de valor, los parámetros formales de la función llamada se tratan como variables locales de la función llamada, y el espacio de memoria se abrirá en la pila para almacenar los valores de los parámetros reales pasados ​​por la función que llama, formando así una copia de los parámetros reales (suplente). La característica de la transferencia de valor es que cualquier operación del parámetro formal por parte de la función llamada se realiza como una variable local y no afectará el valor de la variable de parámetro real de la función que llama (el puntero del parámetro formal cambia y el parámetro real el puntero no cambia).

  En el proceso de transferencia de parámetros de referencia, los parámetros formales de la función llamada también se utilizan como variables locales para abrir espacio de memoria en la pila, pero en este momento se almacena la dirección de la variable de parámetro real introducida por la función de llamada. Cualquier operación de la función llamada en los parámetros formales (cuerpo) se procesa como direccionamiento indirecto, es decir, se accede a la variable de parámetro real en la función que llama a través de la dirección almacenada en la pila (el cuerpo en la función que llama se encuentra de acuerdo con el alias). Por lo tanto, cualquier operación sobre los parámetros formales de la función llamada afectará a las variables de parámetros reales en la función de llamada.

  Pasar por referencia y pasar por puntero son diferentes.Aunque ambos son una variable local en el espacio de pila de la función llamada, cualquier procesamiento de parámetros de referencia operará a la variable relevante en la función de llamada a través de un método de direccionamiento indirecto. Para los parámetros pasados ​​por el puntero, si se cambia la dirección del puntero en la función llamada, no se aplicará a las variables relevantes de la función que llama. Si desea cambiar la variable relevante (dirección) en la función de llamada a través del paso de un parámetro de puntero, entonces debe usar un puntero a un puntero o una referencia de puntero.

  Desde la perspectiva de la compilación, el programa agrega punteros y referencias a la tabla de símbolos cuando se compila el programa, la tabla de símbolos registra el nombre de la variable y la dirección correspondiente a la variable. El valor de dirección correspondiente de la variable de puntero en la tabla de símbolos es el valor de dirección de la variable de puntero, y el valor de dirección correspondiente a la referencia en la tabla de símbolos es el valor de dirección del objeto referenciado (diferente del nombre del parámetro real, el dirección es la misma). La tabla de símbolos no se cambiará después de que se genere, por lo que el puntero puede cambiar el objeto al que apunta (el valor en la variable del puntero se puede cambiar), pero el objeto referenciado no se puede modificar.

 

3. Resumen

Similitudes: el concepto de direcciones

diferencia:

1) El puntero es una entidad (sustituto); la referencia es solo un alias (otro nombre del cuerpo)

2) La referencia solo se puede inicializar una vez en el momento de la definición, y no se puede cambiar posteriormente, es decir, "de uno al final", el puntero se puede modificar, es decir, "cambio de pensamiento";

3) La referencia no puede estar vacía (solo si hay un cuerpo, hay un alias), el puntero puede estar vacío;

4) tamaño de referencia, obtenga el tamaño de la variable puntiaguda; tamaño del puntero, obtenga el tamaño del puntero;

5) Pointer ++ se refiere al incremento de la dirección del puntero, la referencia ++ se refiere al incremento de la variable apuntada;

6) La referencia es de tipo seguro y el proceso de referencia se comprobará de tipo; los punteros no se comprobarán de forma segura;

Suplemento: método en lenguaje C de pasar por referencia

#incluir

#incluir

int main (int argc, const char * argv []) {

pi doble = 3,14;

double intgerPart;

doble fracciónPart;

fracciónPart = modf (pi, & intgerPart);

printf ("La parte de número entero de Pi es% .0f, y la parte de fracción de Pi es% .2f \ n", intgerPart, fracciónPart);

return 0;

}

Resultado:

La parte de número entero de Pi es 3 y la parte de fracción de Pi es 0,14

El programa terminó con el código de salida: 0

Lo anterior es la diferencia entre el paso de referencia y el paso de puntero en C ++ introducido por el editor, espero que le sea útil.

 

Si desea mejorar su capacidad de programación, ¡aprenda el lenguaje C y la programación C ++! Adelantar en una curva, ¡un paso más rápido!

[ Círculo de pingüinos de aprendizaje de lenguaje C C ++ ], compartir (código fuente, video de combate real del proyecto, notas del proyecto, tutorial introductorio básico)

¡Bienvenidos socios que cambian de carrera y aprenden programación, usan más información para aprender y crecer más rápido de lo que usted puede pensar!

Programación de libros de aprendizaje:

 

Programación de video de aprendizaje:

 

Supongo que te gusta

Origin blog.csdn.net/Hsuesh/article/details/112666204
Recomendado
Clasificación