La CLI distingue entre punteros gestionados y no gestionados. Se escribe un puntero administrado, el tipo de valor apuntado es conocido por el tiempo de ejecución y solo se permiten las asignaciones seguras. Los punteros no administrados solo se pueden usar directamente en un lenguaje que los admite, C++/CLI es el mejor ejemplo.
El equivalente de un puntero no administrado en el lenguaje C# es IntPtr
. Puede convertir libremente un puntero hacia adelante y hacia atrás con un molde. No se asocia ningún tipo de puntero aunque su nombre suena como "puntero a int", es el equivalente de void*
en C/C++. El uso de dicho puntero requiere pinvoke, la clase Marshal o un lanzamiento a un tipo de puntero administrado.
algo de código para jugar con:
using System;
using System.Runtime.InteropServices;
unsafe class Program {
static void Main(string[] args) {
int variable = 42;
int* p = &variable;
Console.WriteLine(*p);
IntPtr raw = (IntPtr)p;
Marshal.WriteInt32(raw, 666);
p = (int*)raw;
Console.WriteLine(*p);
Console.ReadLine();
}
}
Nota cómo la palabra clave unsafe
es apropiado en este caso. Puede llamar a Marshal.WriteInt64() y no recibirá ninguna queja en absoluto. Corrompe el marco de la pila.
Tenga en cuenta 'IntPtr' no es más que un tipo de datos primitivo en .NET que está diseñado para contener una dirección. Básicamente es simplemente un 'int' que es 32 bits en una máquina de 32 bits y 64 bits en una máquina de 64 bits. Nada acerca de 'IntPtr' en sí mismo es específico para los punteros. –