Uvod v kazalce v C #

Kazalci so opredeljeni kot spremenljivka, ki vsebuje pomnilniški naslov druge spremenljivke. Kazalci v C # se uporabljajo kadar koli je izjava, ki ni varna in je označena z nevarno ključno besedo. Te vrste stavkov ne nadzorujejo smeti in uporabljajo spremenljivke kazalcev.

Sintaksa: kazalci se lahko razglasijo kot

type *var name;
int* a;

Tu se * imenuje de-referenčni operater in a je spremenljivka, ki vsebuje naslov tipa int.

Primer

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

Kako delujejo kazalci v C #?

Spodaj so primeri, ki prikazujejo, kako deluje v C #.

Kazalci v C # - primer 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();
)
)
)

Obstajajo različni načini izvedbe stavkov kot nevarnih, kot je Modifier, konstruktor itd. V zgornjem primeru je skupina stavkov označena kot nevarna. V zgornji kodi sta dve spremenljivki a in b z vrednostma 40 oziroma 20, kazalci pa vsebujejo njihove naslove. Console.WriteLine () se uporablja za prikaz vrednosti in naslovov spremenljivk.

Izhod:

Kazalci v C # - primer # 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();
)
)
)

V zgornjem primeru se nevarno uporablja metoda, ki ima dve spremenljivki a in b z vrednostma 50 oziroma 20. Kazalca * ptr1 in * ptr2 kažeta na spominska naslova.

Izhod:

Kazalci v C # - primer # 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();
)
)
)
)

V zgornji kodi je določena matrika, ki je sestavljena iz petih elementov in Console.WriteLine () se uporablja za prikaz vrednosti elementov matrike in naslova elementov matrike. V C # obstaja koncept, ki ga poznamo kot Pripenjanje predmeta. V zgornji kodi je za pripenjanje predmetov uporabljen fiksni stavek, tako da zbiralnik smeti ne bo dovolil predmetu, da se premika in ga "pripenja". To lahko vpliva na učinkovitost izvajanja.

Izhod:

Kazalci v C # - primer # 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
)

V zgornjem primeru se zaposleni sestavi s člani id zaposlenega in plačo ter konfigurira konstruktor tako, da inicializira vrednosti. Kazalci kažejo na strukture, ki vsebujejo primitivno vrednost vrednosti namesto struktur, ki vsebujejo referenčni tip. V glavni metodi sta dve spremenljivki za zaposlene in kazalci na zaposlene, ki sta inicializirani z naslovoma E1 in E2. Console.WriteLine () se uporablja za prikaz podrobnosti zaposlenega s kazalci.

Izhod:

Kazalci v C # - Primer # 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();
)
)
)
)
)

V zgornji kodi je uporabljena ključna beseda stackalloc, v kateri je pomnilnik dodeljen na nizu. Med izvedbo metode se ustvari pomnilnik, izveden na bloku sklada. stackalloc je boljši v zmogljivosti in ni treba pripenjati matrike. Bolje je od matrike, dodeljene v velikem obsegu, saj ga ni treba sprostiti, ker se samodejno sprosti, ko se metoda vrne.

Izhod:

V kazalcih so pretvorbe implicitne in eksplicitne vrste. Implicitna vrsta pretvorbe je kot vsaka vrsta kazalca do ničnega * in ničelna za katero koli vrsto kazalca. Pri eksplicitni vrsti so pretvorbe od bajta, sbyte, ushort, kratkega, uint, int, ulong, long do katere koli vrste kazalca ali obratno in enega kazalca do drugega kazalca.

Zaključek - Kazalci v C #

Tako se kazalci uporabljajo za usmerjanje spominskih naslovov in izvajanje z nevarno kodo stavkov. Uporablja se le v neurejenem okolju in ga zbiralnik smeti ne spremlja. Kazalniki se uporabljajo v nizu, čakalni vrsti itd.

Priporočeni članki

To je vodnik po kazalcih v C #. Tukaj razpravljamo o Uvodu in kako deluje kazalec v C # skupaj z različnimi primeri. Če želite izvedeti več, si oglejte tudi naslednje članke -

  1. Uporabe C #
  2. Kazalniki v C ++
  3. Zmogljivost C # vs Java
  4. Kaj je C?