Código inseguro (palabra clave insegura) y puntero fijo (palabra clave fija) en C #

Primero configúrelo:

Haga clic con el botón derecho en el proyecto, seleccione Generar y marque Permitir código inseguro.
Inserte la descripción de la imagen aquí

Explique qué es un código inseguro:

C # es un lenguaje administrado, no necesita administrar la memoria usted mismo. Hay algunos mecanismos que han reemplazado a los punteros en C / C ++, como referencias, alojamiento y eventos. Pero C # no descarta completamente los punteros como lo hace Java, por lo que los punteros aún se pueden usar en C #. Cuando un bloque de código usa el modificador inseguro, C # permite que se usen variables de puntero en la función. El código inseguro o no administrado se refiere a bloques de código que utilizan variables.

Utilice la palabra clave insegura para escribir código inseguro

Debido a que el uso de punteros conlleva riesgos relacionados, C # solo permite que se usen punteros en bloques de código especialmente marcados. La palabra clave utilizada para marcar el código no es segura. El siguiente código marca un método como inseguro:

   unsafe int GetSomeNumber()
    {
    
    
        //code that can use pointers
    }

Ejemplos específicos:

Ejemplo 1:

using System;

namespace UnsafeCodeApplication
{
    
    
    class Program
    {
    
    
        static unsafe void Main(string[] args)
        {
    
    
            int var = 20;
            int* p = &var;
            Console.WriteLine("Data is :{0}", var);
            Console.WriteLine("Address is:{0}", (int)p);
            Console.ReadKey();
            
        }
    }


}

Resultado de la operación:
Inserte la descripción de la imagen aquí
Ejemplo 2:

/*使用指针检索数据值*/
using System;
namespace UnsafeCodeApplication
{
    
    
    class Progarm
    {
    
    
        public static void Main()
        {
    
    
            unsafe
            {
    
    
                int var = 20;
                int* p = &var;
                Console.WriteLine("Data is:{0}", var);
                Console.WriteLine("Data is:{0}", p->ToString());
                Console.WriteLine("Address is:{0}", (int)p);  //(int)p取得到p的地址
            }
            Console.ReadKey();
        }
    }
}

Resultado de la operación:
Inserte la descripción de la imagen aquí
Ejemplo 3:

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();
        }
    }
}

resultado de la operación:
Inserte la descripción de la imagen aquí

Ejemplo 4:

/*使用指针访问数组元素*/
using System;
namespace UnsafeCodeApplication
{
    
    
    class TestPointer
    {
    
    
        public unsafe static void Main()
        {
    
    
            int[] list = {
    
     10, 100, 1000 };
            //因为int* ptr 和int[]list是不同类型的,
            //指针ptr在内存中是不固定
            //而数组地址是固定的
            //所以要用fixed关键字来固定指针
            fixed(int* ptr = list)   //固定指针
                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();

        }
    }
}

resultado de la operación:
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/weixin_50188452/article/details/114961276
Recomendado
Clasificación