Ukazovateľ vs pole
Ukazovateľ je typ údajov, ktorý obsahuje odkaz na pamäťové miesto (t.j. premenná ukazovateľa ukladá adresu pamäťového miesta, v ktorom sú uložené niektoré údaje). Polia sú najčastejšie používanou dátovou štruktúrou na ukladanie kolekcie prvkov. Väčšina programovacích jazykov poskytuje metódy na jednoduché deklarovanie polí a prístup k prvkom v poliach.
Čo je ukazovateľ?
Ukazovateľ je typ údajov, ktorý ukladá adresu miesta v pamäti, v ktorom sú uložené niektoré údaje. Inými slovami, ukazovateľ obsahuje odkaz na pamäťové miesto. Prístup k údajom uloženým v pamäťovom mieste, na ktoré odkazuje ukazovateľ, sa nazýva dereferencovanie. Pri vykonávaní opakujúcich sa operácií, ako je prechádzanie stromami/reťazcami, vyhľadávanie v tabuľkách atď., by použitie ukazovateľov zlepšilo výkon. Je to preto, že dereferencovanie a kopírovanie ukazovateľov je lacnejšie ako skutočné kopírovanie a prístup k údajom, na ktoré poukazujú. Nulový ukazovateľ je ukazovateľ, ktorý na nič neukazuje. V jazyku Java by prístup k nulovému ukazovateľu vygeneroval výnimku s názvom NullPointerException.
Čo je pole?
Na obrázku 1 je znázornený kus kódu, ktorý sa zvyčajne používa na deklarovanie a priraďovanie hodnôt do poľa. Obrázok 2 znázorňuje, ako by pole vyzeralo v pamäti.
int values[5]; values[0]=100; values[1]=101; values[2]=102; values[3]=103; values[4]=104; |
Obrázok 1: Kód na deklarovanie a priraďovanie hodnôt do poľa
100 | 101 | 102 | 103 | 104 |
Index: 0 | 1 | 2 | 3 | 4 |
Obrázok 2: Pole uložené v pamäti
Vyššie uvedený kód definuje pole, ktoré môže uložiť 5 celých čísel a pristupuje sa k nim pomocou indexov 0 až 4. Jednou z dôležitých vlastností poľa je, že celé pole je alokované ako jeden blok pamäte a každý prvok dostane svoju vlastný priestor v poli. Akonáhle je pole definované, jeho veľkosť je pevná. Takže ak si nie ste istí veľkosťou poľa v čase kompilácie, museli by ste definovať dostatočne veľké pole, aby ste boli na bezpečnej strane. Väčšinou však v skutočnosti použijeme menší počet prvkov, ako sme pridelili. Značné množstvo pamäte je teda skutočne premrhané. Na druhej strane, ak „dosť veľké pole“nie je v skutočnosti dostatočne veľké, program spadne.
Aký je rozdiel medzi ukazovateľmi a poliami?
Ukazovateľ je dátový typ, ktorý ukladá adresu miesta v pamäti, v ktorom sú uložené niektoré dáta, zatiaľ čo polia sú najbežnejšie používanou dátovou štruktúrou na ukladanie kolekcie prvkov. V programovacom jazyku C sa indexovanie poľa vykonáva pomocou aritmetiky ukazovateľa (t. j. i-tý prvok poľa x by bol ekvivalentný (x+i)). Preto v C možno množinu ukazovateľov, ktoré ukazujú na množinu pamäťových umiestnení, ktoré sú po sebe nasledujúce, považovať za pole. Ďalej je rozdiel v tom, ako operátor sizeof funguje na ukazovateľoch a poliach. Pri použití na pole operátor sizeof vráti celú veľkosť poľa, zatiaľ čo pri použití na ukazovateľ vráti iba veľkosť ukazovateľa.