Red de conocimiento informático - Aprendizaje de código fuente - Tipo de referencia de puntero

Tipo de referencia de puntero

Una referencia puede considerarse como un puntero constante, como por ejemplo:

int a=10

int &b=a; > const int *c=&a

Las dos oraciones anteriores tienen casi el mismo significado.

Para aplicaciones simples, la implementación de bajo nivel es la misma:

int a=10

int *b=&a; p> Generar código como este

mov [ebp],10

lea eax,[ebp]

mov [ebp-10],eax

p>

Cita:

int a=10

int &b=a

Generar el mismo código

mov [ebp],10

lea eax,[ebp]

mov [ebp-10],eax

Pero algo salió mal al pasar parámetros Igual. .

A continuación se muestra una copia de una sección de la discusión sobre la transferencia de funciones de punteros y referencias. Soy demasiado vago para escribirla, así que simplemente la leeré.

Cuando se pasa un puntero como parámetro, la dirección a la que apunta el puntero se operará directamente.

Cuando se pasa una referencia del puntero, se utiliza el direccionamiento indirecto para operar. en la dirección señalada por el puntero.

Quedará claro si observas el contenido desensamblado del siguiente programa

#include

usando namespace std

<; p > void f1(int *&a)

{

int *b

b=a

}

void f2(int *a)

{

int *b;

b=a

}

p>

void main()

{

int m=10

int *n=&m; p> f1 (n);

f2(n);

}

//-------------- --- ----------------------------------------------- --- --------

* Referenciado por LLAMADA a la Dirección:

|:00401187

:00401150 55 push ebp

:00401151 8BEC mov ebp, esp

:00401153 51 push ecx

//[ebp+08] es el contenido push : n La dirección efectiva de m

:00401154 8B4508 mov eax, dword ptr [ebp+08]

//Obtener la dirección efectiva de m en la función principal -》edx

:00401157 8B10 mov edx, dword ptr [eax]

//b=a

:00401159 8955FC mov dword ptr [ebp-04], edx

:0040115C 59 pop ecx

:0040115D 5D pop ebp

:00

40115E C3 ret

* Referenciado por una LLAMADA a la Dirección:

|:00401190

:00401160 55 push ebp p>

:00401161 8BEC mov ebp, esp

:00401163 51 push ecx

//Obtener el contenido push: el contenido efectivo de n (es decir, el dirección efectiva de m)

:00401164 8B4508 mov eax, dword ptr [ebp+08]

//b=a

:00401167 8945FC mov dword; ptr [ebp-04] , eax

:0040116A 59 pop ecx

:0040116B 5D pop ebp

:0040116C C3 ret

------ ---------->Inicio de función<---------------------------

:00401170 55 push ebp

:00401171 8BEC mov ebp, esp

:00401173 83C4F8 add esp, FFFFFFF8

int m=10 <; /p>

:00401176 C745FC0A000000 mov [ebp-04], 0000000A

int *n=&m

:0040117D 8D45FC lea eax, dword ptr [ebp-04]

:00401180 8945F8

mov dword ptr [ebp-08], eax

f1(n);

//Dado que el parámetro formal es una variable de referencia, la dirección efectiva de n se inserta en la pila.

:00401183 8D55F8 lea edx, dword ptr [ebp-08]

:00401186 52 push edx

:00401187 E8C4FFFFFF llamada 00401150

:0040118C 59 pop ecx

f2(n);

//Dado que el parámetro formal es una variable de puntero, el contenido efectivo de n se inserta en la pila (es decir, la dirección efectiva de m)

:0040118D FF75F8 push [ebp-08]

:00401190 E8CBFFFFFF call 00401160

:00401195 59 pop ecx

:00401196 59 pop ecx

:00401197 59 pop ecx

:00401198 5D pop ebp

:00401199 C3 ret