English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Cuando un bloque de código usa}} Inseguro Cuando se utiliza el modificador de marcador, C# permite usar variables de puntero en funciones.código no segurou código no administrado es el que utilizaPunteroBloque de código de variable.
Puntero es una variable que almacena la dirección de otra variable, es decir, la dirección de la ubicación de memoria directa. Al igual que otros variables o constantes, debe declarar el puntero antes de almacenar la dirección de otra variable en él.
La forma general de declaración de variable de puntero es:
type* var-name;
A continuación se muestra un ejemplo de declaración de tipo de puntero:
Ejemplo | Descripción |
---|---|
int* p | p es un puntero a un entero. |
double* p | p es un puntero a un número de coma flotante de precisión doble. |
float* p | p es un puntero a un número de coma flotante. |
int** p | p es un puntero a un puntero a entero. |
int*[] p | p es un array unidimensional de punteros a enteros. |
char* p | p es un puntero a un carácter. |
void* p | p es un puntero a un tipo desconocido. |
Al declarar múltiples punteros en la misma declaración, el asterisco * Sólo se escribe junto con tipos básicos; no se utiliza como prefijo para cada nombre de puntero. Por ejemplo:
int* p1, p2, p3; // Correcto int *p1, *p2, *p3; // Error
El siguiente ejemplo ilustra que en C# se utiliza Inseguro Uso de punteros como modificador:
using System; namespace UnsafeCodeApplication { class Program { static unsafe void Main(string[] args) { int var = 20; int* p = &var; Console.WriteLine("Los datos son: {0} ", var); Console.WriteLine("La dirección es: {0}", (int)p); Console.ReadKey(); } } }
Cuando el código anterior se compila y ejecuta, producirá los siguientes resultados:
Los datos son: 20 La dirección es: 99215364
También puede no declarar todo el método como código no seguro, solo declarar una parte del método como código no seguro. El siguiente ejemplo ilustra esto.
Puede usar ToString() El método recupera los datos almacenados en la posición referenciada por la variable de puntero. El siguiente ejemplo ilustra esto:
using System; namespace UnsafeCodeApplication { class Program { public static void Main() { Inseguro { int var = 20; int* p = &var; Console.WriteLine("Los datos son: {0} ", var); Console.WriteLine("Los datos son: {0} ", p->ToString()); Console.WriteLine("La dirección es: {0} ", (int)p); } Console.ReadKey(); } } }
Cuando el código anterior se compila y ejecuta, producirá los siguientes resultados:
Los datos son: 20 Los datos son: 20 La dirección es: 77128984
Puede pasar una variable de puntero como parámetro del método. El siguiente ejemplo ilustra esto:
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("Antes de Intercambiar: var1:{0}, var2: {1}1, var2); p.swap(x, y); Console.WriteLine("Después de Intercambiar: var1:{0}, var2: {1}1, var2); Console.ReadKey(); } } }
Cuando el código anterior se compila y ejecuta, producirá los siguientes resultados:
Antes de Intercambiar: var1: 10, var2: 20 Después de Intercambiar: var1: 20, var2: 10
En C#, el nombre del array y un puntero que apunta a datos del mismo tipo que el array son tipos de variables diferentes. Por ejemplo, int *p y int[] p son tipos de datos diferentes. Puede aumentar el puntero variable p porque no está fijo en la memoria, pero la dirección del array está fija en la memoria, por lo que no puede aumentar el array p.
Por lo tanto, si necesita usar variables de puntero para acceder a los datos del array, puede hacerlo como lo hacemos normalmente en C o C++.++ como se hizo en fixed palabras clave para fijar punteros.
El siguiente ejemplo demuestra esto:
using System; namespace UnsafeCodeApplication { class TestPointer { public unsafe static void Main() { int[] list = {10, 100, 200}; fixed(int *ptr = list /* Mostrar la dirección del array en el puntero */ for (int i = 0; i < 3; i++) { Console.WriteLine("Dirección de list[{0}]=");1} + i)); Console.WriteLine("Valor de list[{0}]=");1} *(ptr + i)); } Console.ReadKey(); } } }
Cuando el código anterior se compila y ejecuta, producirá los siguientes resultados:
Dirección de list[0] = 31627168 Valor de list[0] = 10 Dirección de list[1] = 31627172 Valor de list[1] = 100 Dirección de list[2] = 31627176 Valor de list[2] = 200
Para compilar código inseguro, debe cambiar al compilador de línea de comandos especificado /Inseguro Línea de comandos.
Por ejemplo, para compilar un programa llamado prog que contiene código inseguro1Para compilar un programa .cs que contenga código inseguro, debe ingresar el comando en la línea de comandos:
csc /unsafe prog1.cs
Si utiliza Visual Studio IDE, debe activar el código inseguro en las propiedades del proyecto.
Los pasos son los siguientes:
Si utiliza Visual Studio IDE, debe activar el código inseguro en las propiedades del proyecto.Propiedades del proyecto (project properties)。
Hacer clic Compilar Pestaña.
Seleccionar opción"Permitir código inseguro"。