La diferencia entre punteros y "referencias"
En primer lugar, la diferencia entre punteros y referencias
(1) Una referencia siempre apunta a un objeto, no existe tal cosa una referencia nula. Por lo tanto, los punteros deben usarse independientemente de si es posible señalar un objeto.
Debido a que C++ requiere que la referencia apunte siempre a un objeto, la referencia necesita un valor inicial.
Cuerdas y hilos. RS = cadena 1;
Debido a que no existe la llamada referencia nula, no es necesario probar si tiene un valor antes de usarlo, pero sí debe probar su validez cuando se usa un puntero.
(2) Los punteros se pueden reasignar y las referencias siempre apuntan a objetos originales o locales.
(3) Cuando se debe usar una referencia, el operador Operador [] debe devolver algo que pueda usarse como objeto de asignación, por lo que se le debe devolver una referencia.
(4)De hecho, las referencias se utilizan a menudo en los parámetros de funciones.
void Get * * *(const int & A) //Esto asegura que el valor referenciado no se modifique.
{
}
★Similitudes:
1. Ambos son conceptos de dirección;
El puntero apunta a un fragmento de memoria y su contenido es la dirección de la memoria; la referencia es el alias del bloque de memoria;
★Diferencia:
1. Los punteros son entidades y las referencias son solo nombres individuales;
2. No es necesario eliminar la referencia (*) cuando se usa. referencias, pero se requiere desreferencia de punteros;
3. Una referencia solo se puede inicializar una vez cuando está definida, y luego se vuelve inmutable; los punteros son mutables;
Las referencias "de un; corazón a otro corazón"
4. Las referencias no tienen constante, los punteros tienen constante y los punteros constantes son inmutables;
5. Las referencias no pueden ser nulas, pero los punteros pueden ser nulos;
6. "sizeof reference" obtiene el tamaño de la variable apuntada (objeto) y "Sizeof pointer" obtiene el tamaño del puntero en sí (la dirección de la variable u objeto apuntado);
La constante typeid(T) = = typeid(T &) es verdadera, sizeof(t) = = sizeof(t &) siempre es correcta,
Pero cuando la referencia se usa como un miembro, ocupa el mismo espacio que el espacio del puntero (no se encontraron disposiciones estándar).
7. Los punteros y las referencias tienen diferentes significados en las operaciones de incremento (++).
2. Paso de puntero y paso de referencia en C++ (disposiciones adicionales)
Conceptualmente. Un puntero es esencialmente una variable que almacena la dirección de una variable. La variable es lógicamente independiente y se puede cambiar, incluidos cambios en la dirección a la que apunta y cambios en los datos almacenados en la dirección a la que apunta.
Una referencia es un alias, no es lógicamente independiente, su existencia es dependiente, por lo que la referencia debe inicializarse al principio, y el objeto al que hace referencia no puede cambiar durante todo su ciclo de vida (It. solo se puede adjuntar a la misma variable de principio a fin).
En C++, los punteros y las referencias se utilizan a menudo para pasar parámetros de funciones. Sin embargo, pasar parámetros mediante punteros y pasar parámetros por referencia son esencialmente diferentes:
Pasar parámetros mediante punteros es esencialmente una forma de pasar un valor, y lo que se pasa es un valor de dirección. Durante 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 puesto por la función que llama, convirtiéndose así una copia del parámetro real. La característica de la transferencia de valor es que cualquier operación de la función de sintonización sobre los parámetros formales se realiza como una variable local y no afectará el valor de la variable de parámetro real de la función tónica. El valor de la dirección del puntero del argumento en sí no cambiará.
En el proceso de paso de referencia, aunque los parámetros formales de la función llamada también se utilizan como variables locales para abrir espacio de memoria en la pila, lo que se almacena en este momento es la dirección del parámetro real. variable puesta por la función que llama. Cualquier operación sobre parámetros formales realizada por la función llamada se considera direccionamiento indirecto, es decir, acceder a las variables de parámetros reales en la función de llamada principal a través de la dirección almacenada en la pila. Debido a esto, cualquier cosa que haga la función de sintonización con los parámetros formales afectará las variables de argumento en la función tónica.
Existe una diferencia entre pasar por referencia y pasar por puntero. Aunque todas son variables locales en el espacio de pila de la función llamada, cualquier procesamiento de parámetros de referencia operará en variables relacionadas en la función de llamada principal mediante direccionamiento indirecto. Para los parámetros pasados por punteros, si la dirección del puntero en la función llamada cambia, no afectará las variables relevantes de la función que llama. Si desea cambiar las variables relevantes en la función tónica pasando parámetros de puntero, debe usar puntero a puntero o referencia de puntero.
Para profundizar aún más la diferencia entre punteros y referencias, explicaré la diferencia entre los dos desde la perspectiva de la compilación:
Al compilar, el programa agrega punteros y referencias a la tabla de símbolos y los registros de la tabla de símbolos Se especifican el nombre de la variable y la dirección correspondiente a la variable. El valor de dirección correspondiente a 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 al objeto de referencia en la tabla de símbolos es el valor de dirección del objeto de referencia. La tabla de símbolos no cambia después de su generación, por lo que el puntero puede cambiar el objeto al que apunta (el valor en la variable del puntero puede cambiar), pero el objeto al que se hace referencia no se puede modificar.
Finalmente, resuma las similitudes y diferencias entre punteros y referencias:
★Similitudes:
●Ambos son conceptos de título;
El puntero apunta a un fragmento de memoria y su contenido es la dirección de la memoria; la referencia es el alias del bloque de memoria.
★Diferencia:
Los punteros son entidades y las referencias son solo nombres individuales;
●Las referencias solo se pueden inicializar una vez cuando se definen y luego se vuelven inmutables; los punteros son referencias variables "desde un corazón hasta el final", los punteros pueden "ver los problemas desde otro ángulo";
●Las referencias no son constantes, los punteros tienen constantes y los punteros constantes son inmutables. ; (específicamente digamos que no existe una forma como int & Const a, pero hay una const int &. La primera se refiere a la referencia en sí, es decir, el alias no se puede cambiar. Esto es, por supuesto, por lo que no existe). necesidad de este formulario. Este último se refiere al valor de la referencia que no se puede cambiar)
●La referencia no puede ser nula y el puntero puede ser nulo;
●"Sizeof. referencia" obtiene el tamaño de la variable puntiaguda (objeto) y "Tamaño del puntero" obtiene el tamaño del puntero en sí (el tamaño de la verificación de tipo).