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

Указателите са дефинирани като променлива, която съдържа адреса на паметта на друга променлива. Указателите в C # се използват винаги, когато има изявление, което не е безопасно и се маркира с опасна ключова дума. Тези типове операции не контролират сметосъбирачите и използват променливи на показалеца.

Синтаксис: Указателите могат да бъдат декларирани като

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

В горния пример, опасен се използва с метода, който има две променливи 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
)

В горния пример структурата на служителите с идентификационния номер на служителите и заплатата и параметризира конструктора, за да инициализира стойностите. Указателите сочат към структури, които съдържат примитивен тип стойност, вместо структури, съдържащи референтен тип. В основния метод има две променливи на служители и указатели на служители, които се инициализират с адреси 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 * type и null към всеки тип показалец. При явен тип, преобразуванията са от байт, sbyte, ushort, short, uint, int, ulong, long към всеки тип показалец или обратно и един показалец към друг показалец.

Заключение - указатели в C #

Така указателите се използват за насочване към адресите на паметта и тяхното изпълнение с небезопасен код от оператори. Използва се само в неуправляема среда и не се проследява от боклука. Указателите се използват в стек, опашка и т.н.

Препоръчителни статии

Това е ръководство за указатели в C #. Тук обсъждаме Въведение и как работи показалеца в C # заедно с различни примери. Можете също да разгледате следните статии, за да научите повече-

  1. Използване на C #
  2. Показалци в C ++
  3. C # срещу Java Performance
  4. Какво е C?