Введение в указатели в C #

Указатели определяются как переменная, которая содержит адрес памяти другой переменной. Указатели в C # используются всякий раз, когда есть оператор, который является небезопасным и помечен ключевым словом unsafe. Эти типы операторов не контролируют сборщики мусора и используют переменные-указатели.

Синтаксис: указатели могут быть объявлены как

type *var name;
int* a;

Здесь * называется оператором разыменования, а a - это переменная, которая содержит адрес типа int.

пример

int *p = & x; // where &x is the memory address of x
Console.WriteLine((int)p) // displaying memory address
Console.WriteLine(*p) // displaying value at memory address

Как работают указатели в C #?

Ниже приведены примеры, которые показывают, как это работает в C #.

Указатели в C # - Пример № 1

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pointers
(
class Demo
(
public void Method()
(
unsafe
(
int a = 40;
int b = 20;
int* ptr1 = &a;
int* ptr2 = &b;
Console.WriteLine(*ptr1); // displaying the value
Console.WriteLine(*ptr2); // displaying the value
Console.WriteLine((int)ptr1); // displaying the address
Console.WriteLine((int)ptr2); // displaying the address
)
)
)
class Example
(
// main method
public static void Main()
(
Demo d = new Demo();
d.Method();
)
)
)

Существуют различные способы выполнения операторов как небезопасных, такие как модификатор, конструктор и т. Д. В приведенном выше примере группа операторов помечена как небезопасная. В приведенном выше коде есть две переменные a и b со значениями 40 и 20 соответственно, а указатели содержат их адреса. Console.WriteLine () используется для отображения значений и адресов переменных.

Выход:

Указатели в C # - Пример № 2

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pointers
(
class Demo
(
public unsafe void Method()
(
int a = 50;
int b = 20;
int* ptr1 = &a;
int* ptr2 = &b;
Console.WriteLine(*ptr1); // displaying the value
Console.WriteLine(*ptr2); // displaying the value
Console.WriteLine((int)ptr1); // displaying the address
Console.WriteLine((int)ptr2); // displaying the address
)
)
class Example
(
// main method
public static void Main()
(
Demo d = new Demo();
d.Method();
)
)
)

В приведенном выше примере, unsafe используется с методом, который имеет две переменные a и b со значениями 50 и 20 соответственно. Указатели * ptr1 и * ptr2 указывают на их адреса памяти.

Выход:

Указатели в C # - Пример № 3

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pointers
(
class Demo
(
public unsafe static void Main()
(
int() array = ( 10, 20, 30, 40, 50 ); // declaring array
fixed (int* ptr = array) // fixed for pinning the object
/* let us have array address in pointer */
for (int i = 0; i < 5; i++)
(
Console.WriteLine("Value of array((0))=(1)", i, *(ptr + i));
Console.WriteLine("Address of array((0))=(1)", i, (int)(ptr + i));
Console.ReadKey();
)
)
)
)

В приведенном выше коде определен массив, который состоит из пяти элементов, и Console.WriteLine () используется для отображения значения элементов массива и адреса элементов массива. В C # есть концепция, известная как закрепление объекта. В приведенном выше коде фиксированный оператор используется для закрепления объекта, поэтому сборщик мусора не позволит объекту перемещаться и «закреплять» его. Это может повлиять на эффективность времени выполнения.

Выход:

Указатели в C # - Пример № 4

using System;
namespace Pointers
(
// Struct employee
struct Employee
(
// members
// employee id and salary
public int empid;
public double salary;
// Constructor to initialize values
public Employee(int e, double s)
(
empid = e;
salary = s;
)
); // end of struct
class Program
(
// Main Method
static void Main(string() args)
(
// unsafe so as to use pointers
unsafe
(
// Declaring two employee Variables
Employee E1 = new Employee(798, 30000);
Employee E2 = new Employee(799, 31000);
// Declaring two employee pointers
// and initializing them with addresses
// of E1 and E2
Employee* E1_ptr = &E1;
Employee* E2_ptr = &E2;
// Displaying details of employees using pointers
// Using the arrow ( -> ) operator
Console.WriteLine("Details of Employee 1");
Console.WriteLine("Employee Id: (0) Salary: (1)",
E1_ptr->empid, E1_ptr->salary);
Console.WriteLine("Details of Employee 2");
Console.WriteLine("Employee Id: (0) Salary: (1)",
E2_ptr->empid, E2_ptr->salary);
) // end unsafe
) // end main
) // end class
)

В приведенном выше примере структура employee с идентификатором сотрудника member и окладом и параметризованным конструктором для инициализации значений. Указатели указывают на структуры, которые содержат тип примитивного значения вместо структур, содержащих ссылочный тип. В основном методе есть две переменные сотрудника и указатели сотрудников, которые инициализируются с адресами E1 и E2. Console.WriteLine () используется для отображения сведений о сотруднике с помощью указателей.

Выход:

Указатели в C # - Пример № 5

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Pointers
(
class Demo
(
public static void Main()
(
unsafe
(
int* arr = stackalloc int(6); // declaring array
arr(0) = 10;
arr(1) = 20;
arr(2) = 30;
arr(3) = 40;
arr(4) = 50;
arr(5) = 60;
for (int i = 0; i < 6; i++)
(
Console.WriteLine($"Value at (i): (arr(i))");
Console.ReadKey();
)
)
)
)
)

В приведенном выше коде используется ключевое слово stackalloc, в котором память выделяется в стеке. Память, исполняемая в блоке стека, создается во время выполнения метода. Stackalloc лучше по производительности и нет необходимости закреплять массив. Это лучше, чем выделенный из кучи массив, так как нет необходимости освобождать его, потому что он автоматически освобождается при возврате метода.

Выход:

В указателях преобразования имеют неявный и явный тип. Неявный тип преобразования подобен любому типу указателя на тип void * и нулю на любой тип указателя. В явном типе преобразования - это байты, sbyte, ushort, short, uint, int, ulong, long в любой тип указателя или наоборот и один указатель на другой указатель.

Вывод - указатели в C #

Таким образом, указатели используются для указания адресов памяти и выполнения их с небезопасным кодом операторов. Он используется только в неуправляемой среде и не отслеживается сборщиком мусора. Указатели используются в стеке, очереди и т. Д.

Рекомендуемые статьи

Это руководство по указателям в C #. Здесь мы обсуждаем Введение и как работает указатель в C # вместе с различными Примерами. Вы также можете посмотреть следующие статьи, чтобы узнать больше

  1. Использование C #
  2. Указатели в C ++
  3. C # против производительности Java
  4. Что такое С?