La conexión y la diferencia entre referencia y puntero en C / C ++

La conexión y la diferencia entre referencia y puntero en C / C ++

¿Por qué deberían usarse los punteros en C / C ++?

1. Todos los lenguajes de programación utilizan punteros. C ++ expone los punteros a los usuarios (programadores), mientras que lenguajes como JAVA y C # ocultan punteros.
2. El puntero puede representar efectivamente la estructura de datos
3. Puede asignar dinámicamente memoria para realizar la gestión libre de la memoria
4. Conveniente para usar la cadena y el uso eficiente de la matriz
5. El puntero está directamente relacionado con la dirección de almacenamiento de los datos, tales como: la transferencia de valores no es tan buena como la transferencia de direcciones Eficiente, porque la transferencia de valor primero toma el valor de la dirección del parámetro real, y luego asigna el valor al parámetro formal en el cálculo de la función; y el puntero apunta directamente la dirección del parámetro formal a la dirección del parámetro real, y obtiene directamente los datos cuando se usa, la eficiencia mejora, especialmente en la asignación frecuente En otros casos (nota: ¡el cambio de los parámetros formales afectará los parámetros reales!)

¿La diferencia entre referencia y puntero?

Primero con las claras palabras de introducción:
puntero - para un tipo T, T es un tipo de puntero T, que es un T variables de tipo puede contener la dirección de un objeto T, y T es el tipo que puede agregar algunos calificadores, Tales como const, volátil, etc. Vea la figura a continuación, el significado del puntero que se muestra:
Inserte la descripción de la imagen aquí
Referencia -Referencia es un alias de un objeto, utilizado principalmente para parámetros de función y tipos de valores de retorno, el símbolo X & indica una referencia de tipo X. Vea la figura a continuación, el significado de las citas que se muestran:
Inserte la descripción de la imagen aquí

  1. El puntero puede modificar el valor señalado por la dirección, también puede apuntar a otras direcciones; y la referencia siempre apunta al objeto especificado en la inicialización , pero puede modificar el valor del objeto
  2. Desde el punto de vista de la asignación de memoria, el programa asigna el área de memoria para la variable de puntero, pero no para la referencia , porque la referencia debe inicializarse cuando se declara, para apuntar a un objeto existente. Las referencias no pueden apuntar a valores nulos.
  3. Desde la perspectiva de la compilación, el programa agrega punteros y referencias a la tabla de símbolos durante la compilación, y 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 de la referencia en la tabla de símbolos es el valor de dirección del objeto de referencia . Una vez que se genera la tabla de símbolos, no se cambiará, por lo que el puntero puede cambiar el objeto señalado (el valor en la variable del puntero se puede cambiar) y el objeto referenciado no se puede cambiar. Esta es la razón principal por la que el uso de punteros no es seguro y el uso de seguridad de referencia. En cierto sentido, una referencia puede considerarse un puntero que no puede cambiar la dirección.
  4. El hecho de que no haya referencias a valores nulos significa que el código que usa referencias es más eficiente que usar punteros. Porque no necesita probar la validez de la referencia antes de usarla. En cambio, los punteros siempre deben ser probados para evitar que estén vacíos.
  5. En teoría, no hay límite para el número de niveles de puntero, pero la referencia solo puede ser un nivel . De la siguiente manera:
    int ** p1; // legal. Puntero al puntero
    int * & p2; // legal. Referencia al puntero
    int & * p3; // Ilegal. El puntero a la referencia es ilegal
    int && p4; // ilegal. Las referencias a referencias son ilegales.
    Tenga en cuenta que la lectura anterior es de izquierda a derecha .

En resumen, se puede concluir que "un puntero apunta a un trozo de memoria, y su contenido es la dirección de la memoria señalada; y una referencia es un alias de un trozo de memoria, y la referencia no cambia el señalamiento ".

Const especial

int main()
{
    int i= 0;
    int j=1;
    //常量引用,指向的地址的内容是个常量,不可以修改,即i的值不可以修改
    const int &r = i  ;
    
    //常量指针,p指针的地址可修改,但无法修改指向地址的内容,*p不可修改,即p指针不可以修改j的值,但可以指向i的地址
    const int* p=&j;
    p = &i;

    //指针常量,q指向的地址不可修改,可以修改指向地址的内容,*q可以修改,即q指针只能指向j的地址,但可以修改j的值
    int* const q = &j;
    *q=5;
    
    //常量指针常量,w指向的地址和内容都不可修改,即w和*w均不可修改
    const int* const w = &j;
    
    cout<<j<<endl;
    cout<<i<<endl;
    return 0;
}

Paso del puntero y paso de referencia

  1. El parámetro de transferencia de puntero es esencialmente una forma de transferencia 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, el espacio de memoria se abre en la pila para almacenar el valor del parámetro real introducido por la función de llamada principal, convirtiéndose así en una copia del parámetro real . La característica de la transferencia de valor es que cualquier operación de la función llamada en los parámetros formales se lleva a cabo como una variable local , lo que no afecta el valor de la variable de parámetro real de la función de llamada.
  2. En el proceso de transferencia de referencia, los parámetros formales de la función llamada también abren espacio de memoria en la pila como variables locales, 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 el parámetro formal se procesa en direccionamiento indirecto , es decir , se accede a la variable de parámetro real en la función de llamada a través de la dirección almacenada en la pila . Debido a esto, cualquier operación de la función llamada en los parámetros formales afecta las variables de parámetros reales en la función de llamada .

El paso de referencia y el paso del puntero son diferentes.Aunque todas son variables locales en el espacio de pila de la función llamada, cualquier procesamiento de parámetros de referencia operará en las variables relacionadas 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 afectará a las variables relacionadas de la función llamante. Si desea cambiar las variables relevantes en la función de llamada mediante el paso de parámetros de puntero, debe usar un puntero a un puntero o una referencia de puntero .

Resumen

Finalmente, resuma las similitudes y diferencias entre punteros y referencias:
★ Similitudes:

  1. Todos son conceptos de direcciones; un
    puntero apunta a un trozo de memoria, y su contenido es la dirección de la memoria apuntada; y una referencia es un alias de un trozo de memoria.
    ★ diferencias:
  2. El puntero es una entidad, y la referencia es solo un nombre individual;
  3. Las referencias solo se pueden inicializar una vez en el momento de la definición, y luego inmutables, los punteros son variables, las referencias "de uno a otro", los punteros pueden "pensar diferente";
  4. Las referencias no tienen const, los punteros tienen const, y los punteros const son inmutables; específicamente, no existe una forma de int & const a, y const int & a sí existe. La directriz anterior no puede cambiarse con
    su propio alias, lo cual, por supuesto, no es necesario. De esta forma, el valor de la última directriz no se puede cambiar)
  5. La referencia no puede ser nula, el puntero puede ser nulo;
  6. "Sizeof reference" es el tamaño de la variable (objeto) señalado, y "sizeof pointer" es el tamaño del puntero mismo 4
  7. El significado de la operación de puntero e incremento de referencia (++) es diferente;
  8. Las referencias son de tipo seguro, y los punteros no (las referencias tienen más verificaciones de tipo que punteros)
Publicado 13 artículos originales · elogiado 5 · visitas 459

Supongo que te gusta

Origin blog.csdn.net/why18767183086/article/details/104069687
Recomendado
Clasificación