Tipi di puntatori (Guida per programmatori C#)

In un contesto unsafe, un tipo può essere un tipo puntatore oltre che un tipo di valore o un tipo di riferimento. La dichiarazione di un tipo puntatore può assumere uno dei seguenti formati:

type* identifier;
void* identifier; //allowed but not recommended

I tipi seguenti possono essere tipi puntatore:

I tipi puntatore non ereditano da object. Non sono inoltre previste conversioni tra essi e object. Con i puntatori non sono supportate neanche le operazioni di boxing e unboxing. È tuttavia possibile eseguire conversioni tra tipi puntatore diversi e tra tipi puntatore e tipi integrali.

Quando si dichiarano più puntatori nella stessa dichiarazione, l'operatore * viene scritto solo unitamente al tipo sottostante, non come prefisso di ogni nome di puntatore. Di seguito è riportato un esempio.

int* p1, p2, p3;   // Ok
int *p1, *p2, *p3;   // Invalid in C#

Un puntatore non può puntare a un riferimento o a una struct che contiene riferimenti perché un riferimento a un oggetto può essere sottoposto a procedure di Garbage Collection anche se un puntatore punta a esso. Il Garbage Collector non tiene traccia degli altri tipi puntatore che puntano all'oggetto.

Il valore della variabile del puntatore di tipo myType* è l'indirizzo di una variabile di tipo myType. Di seguito sono riportati alcuni esempi di dichiarazioni di tipi puntatore:

Esempio

Oggetto di descrizione

int* p

p è un puntatore a un intero

int** p

p è un puntatore a un puntatore a un intero

int*[] p

p è una matrice unidimensionale di puntatori a interi

char* p

p è un puntatore a un carattere

void* p

p è un puntatore a un tipo sconosciuto

Per accedere al contenuto nella posizione a cui punta la variabile del puntatore, è possibile utilizzare *, ovvero l'operatore di riferimento indiretto a puntatore. Si consideri ad esempio la seguente dichiarazione:

int* myVariable;

L'espressione *myVariable indica la variabile int individuata all'indirizzo contenuto in myVariable.

Non è possibile applicare l'operatore di riferimento indiretto a un puntatore di tipo void*. È tuttavia possibile eseguire un cast per convertire un puntatore void in qualsiasi altro tipo e viceversa.

Un puntatore può essere null. Se l'operatore di riferimento indiretto viene applicato a un puntatore null, si otterrà un comportamento definito dall'implementazione.

Tenere presente che il passaggio di puntatori tra metodi può generare un comportamento non definito, ad esempio se un puntatore viene restituito a una variabile locale tramite un parametro Out o Ref oppure come risultato della funzione. Se il puntatore è stato impostato in un blocco fisso, la variabile a cui punta potrebbe non essere più fissa.

Nella tabella riportata di seguito sono elencati gli operatori e le istruzioni che è possibile utilizzare con i puntatori in un contesto unsafe:

Operatore/istruzione

Utilizzare

*

Esegue il riferimento indiretto al puntatore.

->

Accede a un membro di una struttura tramite un puntatore.

[]

Indicizza un puntatore.

&

Ottiene l'indirizzo di una variabile.

++ e --

Incrementa e decrementa puntatori.

+ e -

Utilizza l'aritmetica dei puntatori.

==, !=, <, >, <= e >=

Confronta puntatori.

stackalloc

Alloca memoria sullo stack.

Istruzione fixed

Corregge temporaneamente una variabile per consentire di trovarne l'indirizzo.

Specifiche del linguaggio C#

Per ulteriori informazioni, vedere la Specifiche del linguaggio C#. La specifica del linguaggio è la fonte ufficiale per la sintassi e l'utilizzo di C#.

Vedere anche

Riferimenti

Codice unsafe e puntatori (Guida per programmatori C#)

Conversioni di puntatori (Guida per programmatori C#)

Espressioni puntatore (Guida per programmatori C#)

unsafe (Riferimenti per C#)

Istruzione fixed (Riferimenti per C#)

stackalloc (Riferimenti per C#)

Boxing e unboxing (Guida per programmatori C#)

Concetti

Guida per programmatori C#

Altre risorse

Tipi (Riferimenti per C#)