Tipos de puntero (Guía de programación de C#)
En un contexto no seguro, un tipo puede ser un tipo de puntero, un tipo de valor o un tipo de referencia.Una declaración de tipos de puntero adopta una de las formas siguientes:
type* identifier;
void* identifier; //allowed but not recommended
Cualquiera de los tipos siguientes puede ser un tipo de puntero:
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal o bool.
Cualquier tipo de enum.
Cualquier tipo de puntero (pointer).
Cualquier tipo de struct definido por el usuario que sólo contenga campos de tipos no administrados.
Los tipos de puntero no se heredan de object y no existe ninguna conversión entre tipos de puntero y object.Además, las conversiones boxing y unboxing no admiten punteros.Sin embargo, puede realizar conversiones entre diferentes tipos de puntero y entre tipos de puntero y tipos enteros.
Cuando declare varios punteros en la misma declaración, únicamente debe escribir * junto al tipo subyacente, no debe escribirse como prefijo en cada nombre de puntero.Por ejemplo:
int* p1, p2, p3; // Ok
int *p1, *p2, *p3; // Invalid in C#
Un puntero no puede señalar a una referencia o a una struct que contenga referencias porque es posible que la referencia a un objeto pueda recolectarse como elemento no utilizado aunque haya un puntero que la señale.GC no controla si hay tipos de punteros que apuntan a un objeto.
El valor de la variable de puntero de tipo myType* es la dirección de una variable de tipo myType.A continuación se muestran ejemplos de declaraciones de tipos de puntero:
Ejemplo |
Descripción |
---|---|
int* p |
p es un puntero a un entero |
int** p |
p es un puntero a un puntero o a un entero |
int*[] p |
p es una matriz unidimensional de punteros a enteros |
char* p |
p es un puntero a un valor char |
void* p |
p es un puntero a un tipo desconocido |
El operador de direccionamiento indirecto de puntero * puede utilizarse para tener acceso al contenido de la ubicación señalada por la variable de puntero.Por ejemplo, en la siguiente declaración:
int* myVariable;
la expresión *myVariable denota la variable int que se encuentra en la dirección contenida en myVariable.
No se puede aplicar el operador de direccionamiento indirecto a un puntero de tipo void*.Sin embargo, es posible utilizar una conversión de tipos para convertir un puntero de tipo void en cualquier otro tipo de puntero y viceversa.
Un puntero puede ser null.La aplicación del operador de direccionamiento indirecto a un puntero nulo (null) da como resultado un comportamiento definido según la implementación.
Tenga en cuenta que el paso de punteros entre métodos puede provocar un comportamiento no definido.Un ejemplo es la devolución de un puntero a una variable local a través de un parámetro Out o Ref, o como resultado de la función.Si el puntero se estableció en un bloque fijo, es posible que la variable a la que apunta ya no pueda ser fija.
La tabla siguiente muestra los operadores e instrucciones que pueden funcionar sobre punteros en un contexto no seguro:
Operador/instrucción |
Utilice |
---|---|
* |
Realiza el direccionamiento indirecto del puntero. |
-> |
Obtiene acceso a un miembro de un struct a través de un puntero. |
[] |
Indiza un puntero. |
& |
Obtiene la dirección de una variable. |
++ y -- |
Incrementa y reduce los punteros. |
+ y - |
Realiza la aritmética con punteros. |
==, !=, <, >, <= y >= |
Compara los punteros. |
stackalloc |
Asigna memoria en la pila. |
fixed (Instrucción) |
Fija provisionalmente una variable para que pueda encontrarse su dirección. |
Especificación del lenguaje C#
Para obtener más información, vea la Especificación del lenguaje C#. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.
Vea también
Referencia
Código no seguro y punteros (Guía de programación de C#)
Conversiones de puntero (Guía de programación de C#)
Expresiones de puntero (Guía de programación de C#)
fixed (Instrucción, Referencia de C#)
Conversión boxing y unboxing (Guía de programación de C#)