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 tipo 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:

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 integrales.

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 tipo 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#)

unsafe (Referencia de C#)

fixed (Instrucción, Referencia de C#)

stackalloc (Referencia de C#)

Conversión boxing y unboxing (Guía de programación de C#)

Conceptos

Guía de programación de C#

Otros recursos

Tipos (Referencia de C#)