Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
ZveřejnilMatouš Toman
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
101050952 101051048 Proměnná ukazatel na int: *p 101051048 55 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:1242784 Hodnota pB:1242780 Hodnota pD:1242772 Po operacích: Hodnota pU:1242804 Hodnota pB:1242777 Hodnota pD:1242780 5 * 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 = 163.26;
11
Zjednodušení syntaxe V předchozím příkladu zapsanou konstrukci (*pMyStruct).X = 18; (*pMyStruct).D = 163.26; lze zjednodušeně zapsat následujícím způsobem pomocí znaků -> takto: pMyStruct->X = 18; pMyStruct->D = 163.26; 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,… www.wikipedia.com Seriály o programování v jazyce C# : www.živě.cz www.java2s.com www.functionx.com www.csharp-station.com www.msdn.com www.bytes.com www.c-sharpcorner.com
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.