Saltar al contenido

Puntero y referencia en C#

Cuando se trabaja en un contexto inseguro, puede haber tres tipos diferentes:

  1. Puntero
  2. Valor
  3. Referencia

Asumamos que estamos usando el envoltorio inseguro alrededor de nuestras declaraciones para poder reducir el tamaño del código y enfocarnos más en los punteros.

Puntero y referencia en C#
Puntero y referencia en C#

Un esqueleto para la declaración de un puntero se ve así:

1<type;*<name;

csharp

Un ejemplo real de ello sería:

1int* myPointer;

csharp

Solo, un puntero no es realmente bueno para mucho. Es sólo una variable especial que apunta a la ubicación de memoria de otra variable. El tipo que especificamos antes del * se llama un tipo de referencia . Sólo el código no administrado puede ser un tipo de referencia, lo cual es muy importante.

Podemos declarar múltiples punteros en la misma línea.

1 cuerda* nombre, apellido, nickName;

csharp

Nota: Un puntero no puede señalar una referencia o una estructura que contenga referencias.

También podrías definir un puntero a un puntero o doble puntero.

1double** myDouble;

csharp

Esto significa un puntero a un puntero a un doble. Estos se usan típicamente cuando se quiere cambiar o modificar el valor de un puntero basado en otro puntero.

Veamos cómo se ven el valor y las direcciones en un ejemplo.

12345678910111213141516171819202122 usando el Sistema;namespace Pointers{class refderef {estaticvoidMain(string[] args){unsafe{int myNumber =10;int* myPointer;int** miPointerPointer; miPointer =&miNúmero; miPointerPointer =&miPointer; Consola. WriteLine($"El valor de {nombre de(miNúmero)} es {miNúmero}, la dirección de {nombre de(miPunto)} es {(int)miPunto}, y la dirección de {nombre de(miPunto)} es {(int)miPunto}!");} Consola. ReadKey();;}}}

csharp

Esto produce el siguiente resultado:

1El valor de miNúmero es 10, la dirección de miPunto es 9432328, y la dirección de miPunto es 9432324!

bash

Si lo prefieres, puedes usar la palabra clave insegura en las declaraciones de método, también. Cuando lo haga, no tiene que envolver su código de puntero o cualquier cosa relacionada con él, con la declaración insegura, ya que la definición de la función proporcionará esta envoltura.

Demostrémoslo con el siguiente código:

12345678910111213141516171819 usando el Sistema;namespace Pointers{class refderef {staticunsafevoidunsafeMethod(){int myNumber =10;int* myPointer; myPointer =&myNumber; Console.WriteLine($"Viniendo del método inseguro: El valor de {nombrede(miNúmero)} es {miNúmero}, y el puntero {nombrede(miPunto)} con la dirección: {(int)myPointer} tiene el siguiente valor: {*miPuntador}");}estáticoevitar los aros principales (string[] args){unsafeMethod(); Consola.LeerClaves();;}}}

csharp

Esto nos da la siguiente salida cuando se llama.

1Viniendo de un método inseguro: el valor de miNúmero es 10, y el puntero miPunto con dirección: 15724316 tiene el siguiente valor: 10

bash

El proceso de GC hará entre bastidores la gestión de la memoria y moverá los objetos en la memoria. Tenemos la opción de fijar un objeto en la memoria con la palabra clave fija.

Esta palabra clave se utiliza típicamente para crear tablas en las que describimos al GC qué objetos deben permanecer fijos en regiones específicas del código ejecutable. Esto puede resultar en la fragmentación del montón, por lo que debe ser usado con cuidado. Arreglar los objetos sólo cuando sea absolutamente necesario.

Referencia y Derivación

Hemos demostrado cómo trabajar con los punteros en el código anterior. Ahora viene la pregunta, “¿Qué son los operadores de & y ~?” El operador & se llama operador de referencia , y sirve para recuperar la dirección de una variable. Esto a su vez puede ser asignado a un puntero. El operador ~ se llama operador de referencia . Se utiliza para obtener el valor de la dirección referenciada por el puntero.