Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

C# - pointery Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí.

Podobné prezentace


Prezentace na téma: "C# - pointery Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí."— Transkript prezentace:

1 C# - pointery Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí

2 Co je to pointer ?  Pointer je proměnná, jejíž hodnotou je adresa v paměti  Pointery v C# nemají tak široké využití jako v některých jiných jazycích  Využití pointerů nahrazuje použití referenčních datových typů  Pointery mohou obsahovat pouze adresu proměnné nebo pole hodnotového typu  Pointery nejsou „trasovány“ Garbage collectorem (to je důvod proč nemohou pracovat s referenčními typy)  Funkcionality realizované prostřednictvím pointerů musí být v unsafe módu

3 K čemu jsou pointery dobré ?  Obecně v C# na rozdíl od jazyka C++, Delphi, … nepotřebujeme pointery – využíváme vlatností referenčních typů  Zvýšení výkonu aplikace  K provázání našeho kódu s již napsanými funkcemi např. API knihovny, které potřebují pointer jako vstupní parametr  Ke kontrole paměti nebo napsání aplikace která kontroluje paměť jiné aplikace

4 Výhody unsafe kódu  Výkon a flexibilita – nejefektivnější přístup k datům  Adresace paměti – bez použití pointerů nemůžeme kontrolovat kde v paměti se data ukládají  Kompatibilita různých knihoven

5 Nevýhody unsafe kódu  Složitost  Složitější ladění programů  Všechny rizika související s přímou prací s pamětí (přetečení, snaha o přístup do paměti, která neobsahuje data,…)  Type safety – problémy související s kontrolou typů v.NET

6 Proměnná ukazatel na int: *p Proměnná : x Deklarace: Int *p; Deklarace a inicializace (bude ukazovat na x): int *ptr1 = &x; Hodnota pointeru: *p Adresa pointeru: p Deklarace: int x; Hodnota x: x=55; Přes pointer: *p=55; Adresa x: Lze ji získat &x

7 Použití pointerů  static void Main() { int var1 = 5; unsafe //musím před použitím pointerů označit práci v //nechráněném režimu { int * ptr1, ptr2; //definuji dva ukazatele na integer ptr1 = &var1; //ptr1 bude obsahovat adresu proměnné var1 ptr2 = ptr1; //ptr2 bude ukazovat na stejnou proměnnou jako //ptr1 *ptr2 = 20; //měním hodnotu proměnné na kterou ukazuje ptr2, } //tedy hodnotu var1 Console.WriteLine(var1); }

8 Aritmetika s pointery  Předpokládejte že přidáte 1-ku k pointeru na integer. Překladač předpokládá, že chcete přistoupit v paměti k integeru, který následuje, (integer = 4byty v paměti) tedy k adrese na kterou ukazuje pointer přidá 4byty. Analogicky kdyby pointer ukazoval např. na double přidá kompilátor 8Bytů – velikost datového typu double.

9 Aritmetika s pointery  uint u = 3; byte b = 8; double d = 12.5; uint *pU = &u; byte *pB = &b; double *pD = &d; Console.WriteLine(„Před operacemi"); Console.WriteLine(„Hodnota pU:" + (uint) pU); Console.WriteLine(„Hodnota pB:" + (uint) pB); Console.WriteLine(„Hodnota pD:" + (uint) pD); pU += 5; pB -= 3; pD++; Console.WriteLine("\nPo operacích"); Console.WriteLine(„Hodnota pU:" + (uint) pU); Console.WriteLine(„Hodnota pB:" + (uint) pB); Console.WriteLine(„Hodnota pD:" + (uint) pD); Výsledek: Před operacemi Hodnota pU: Hodnota pB: Hodnota pD: Po operacích: Hodnota pU: Hodnota pB: Hodnota pD: * 4 = 20, přidáno k pU. 3 * 1 = 3, odebráno od pB. 1 * 8 = 8, přidáno k pD.

10 Pointery na Struktury a Třídy  Ukazatelé můžeme použít i v případě aby odkazovali na strukturu nebo třídu, pokud ta neobsahuje referenční typy.  Př: struct MyStruct { public long X; public double D; } //Deklarujeme pointer na naši strukturu MyStruct *pMyStruct; //Inicializace proměnné MyStruct myStruct = new MyStruct(); pMyStruct = & myStruct; //Přistupování ke členům proměnné přes ukazatel: (*pMyStruct).X = 18; (*pMyStruct).D = ;

11 Zjednodušení syntaxe  V předchozím příkladu zapsanou konstrukci (*pMyStruct).X = 18; (*pMyStruct).D = ; lze zjednodušeně zapsat následujícím způsobem pomocí znaků -> takto: pMyStruct->X = 18; pMyStruct->D = ; Pozn.: Ukazatele na třídy které neobsahují referenční typy je možné použít – tato problematika přesahuje rámec probírané látky

12 Úkol  Vytvořte program, jednu proměnnou typu integer a dva ukazatele na tuto proměnnou. Vyzkoušejte: 1. inicializovat pouze první ukazatel na tuto proměnnou a podívat se na obsah a adresy všech proměnných 2. inicializovat i druhý pointer na proměnnou integer. Změňte hodnotu proměnné integer přes druhý ukazatel a prohlédněte si znovu obsahy a adresy všech proměných.  Vytvořte program, který bude obsahovat strukturu bod se souřadnicemi x,y. Vytvořte pole 5 prvků, které bude obsahovat ukazatele na jednotlivé body. V cyklu nechte uživatele zadat body pole. Vypište pomocí ukazatelů a průchodu polem jednotlivé body na obrazovku.

13 Závěr  Při práci s pointery musí být programátor opatrný – pracuje v tzv. unsafe módu  Malá chyba může znamenat pád aplikace a může být obtížně naleznutelná  Umožňuje vytvořit efektivnější kód a využít kód druhých stran nebo knihoven, které jejich použití vyžadují  V C# silná podpora referenčních typů jejich použití eliminuje

14 14 Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí Použité materiály: Kniha: Programujeme profesionálně, nakladatelství WROX, autor: Jay Glynn,… Seriály o programování v jazyce C# :


Stáhnout ppt "C# - pointery Centrum pro virtuální a moderní metody a formy vzdělávání na Obchodní akademii T.G. Masaryka, Kostelec nad Orlicí."

Podobné prezentace


Reklamy Google