English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Quando un blocco di codice utilizza unsafe Quando il modificador è utilizzato come marcatura, C# permette l'uso di variabili puntatore nelle funzioni.Codice non sicuroO codice non gestito è quello che utilizzaPuntatoreBlocco di codice della variabile.
Puntatore È una variabile che contiene l'indirizzo di un altro variabile, ovvero l'indirizzo diretto della posizione di memoria. Come altre variabili o costanti, devi dichiarare il puntatore prima di memorizzare l'indirizzo di un'altra variabile.
La forma generale di dichiarazione di una variabile puntatore è:
type* var-name;
Di seguito sono riportati degli esempi di dichiarazione di tipi di puntatore:
Example | Descrizione |
---|---|
int* p | p è un puntatore a un intero. |
double* p | p è un puntatore a un numero a virgola mobile a precisione doppia. |
float* p | p è un puntatore a un numero a virgola mobile. |
int** p | p è un puntatore a un puntatore a interi. |
int*[] p | p è un array di puntatori a interi. |
char* p | p è un puntatore a carattere. |
void* p | p è un puntatore a tipo sconosciuto. |
Quando si dichiarano più puntatori nello stesso dichiarativo, l'asterisco * viene scritto solo con il tipo di base; non viene utilizzato come prefisso per ogni nome di puntatore. Ad esempio:
int* p1, p2, p3; // corretto int* p1, *p2, *p3; // sbagliato
Ecco un esempio che illustra l'uso di in C#: unsafe L'uso del puntatore come修饰符:
using System; namespace UnsafeCodeApplication { class Program { static unsafe void Main(string[] args) { int var = 20; int* p = &var; Console.WriteLine("I dati sono: {0} ", var); Console.WriteLine("L'indirizzo è: {0}", (int)p); Console.ReadKey(); } } }
When the above code is compiled and executed, it will produce the following results:
I dati sono: 20 L'indirizzo è: 99215364
Puoi anche non dichiarare l'intero metodo come codice non sicuro, ma solo una parte del metodo come codice non sicuro. Ecco un esempio che illustra questo punto.
Puoi usare ToString() Il metodo recupera i dati memorizzati nella posizione referenziata dal variabile puntatore. Ecco un esempio che illustra questo punto:
using System; namespace UnsafeCodeApplication { class Program { public static void Main() { unsafe { int var = 20; int* p = &var; Console.WriteLine("I dati sono: {0} ", var); Console.WriteLine("I dati sono: {0} ", p->ToString()); Console.WriteLine("L'indirizzo è: {0} ", (int)p); } Console.ReadKey(); } } }
When the above code is compiled and executed, it will produce the following results:
I dati sono: 20 I dati sono: 20 L'indirizzo è: 77128984
Puoi passare variabili puntatore come parametri del metodo. Ecco un esempio che illustra questo punto:
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe void swap(int* p, int* q) { int temp = *p; *p = *q; *q = temp; } public unsafe static void Main() { TestPointer p = new TestPointer(); int var1 = 10; int var2 = 20; int* x = &var1; int* y = &var2; Console.WriteLine("Before Swap: var1: {0}, var2: {1}", var1, var2); p.swap(x, y); Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2); Console.ReadKey(); } } }
When the above code is compiled and executed, it will produce the following results:
Before Swap: var1: 10, var2: 20 After Swap: var1: 20, var2: 10
In C#, the array name and a pointer to the data type of the array are different variable types. For example, int *p and int[] p are different types. You can increment the pointer variable p because it is not fixed in memory, but the array address is fixed in memory, so you cannot increment the array p.
Therefore, if you need to use pointer variables to access array data, you can use it as we usually do in C or C++ fixed Keywords to fix pointers.
The following example demonstrates this:
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe static void Main() { int[] list = {10, 100, 200}; fixed(int *ptr = list) /* Display array address in pointer */ for (int i = 0; i < 3; i++) { Console.WriteLine("Address of list[{0}]={1}", i, (int)(ptr + i)); Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i)); } Console.ReadKey(); } } }
When the above code is compiled and executed, it will produce the following results:
Address of list[0] = 31627168 Value of list[0] = 10 Address of list[1] = 31627172 Value of list[1] = 100 Address of list[2] = 31627176 Value of list[2] = 200
To compile unsafe code, you must switch to the command line compiler specified /unsafe Command line.
Ad esempio, per compilare un programma chiamato prog1.cs che contiene codice non sicuro, inserisci il comando: }}
csc /unsafe prog1.cs
Se stai utilizzando l'IDE Visual Studio, devi abilitare il codice non sicuro nelle proprietà del progetto.
I passaggi sono i seguenti:
Per aprire, fare doppio clic sul nodo Proprietà (properties) nel gestore risorse (Solution Explorer)Proprietà del progetto (project properties)。
Clicca Compila Scheda.
Scegli un'opzione"Permetti codice non sicuro"。