====== Pole a pointery ====== ===== Pole ===== Pole slouží k uchování více proměnných stejného typu. V jazyce C je jeho velikost definována předem a lze klasicky vytvořit i pole vícerozměrné (takové pole prakticky do svých hodnot přiřazuje další pole o zvolené velikosti – dvojrozměrné by tedy vytvářelo 2D prostor). Deklarace v jazyce C se provádí stejně jako deklarace proměnné, akorát je za název vložen popis pole s rozměry: ''int pole[10];'' ''char dvojpole[10][6];'' Přístup k jednotlivým hodnotám se provádí obdobně (je třeba dbát na to, že hodnoty začínají nulou): ''printf("Paty prvek pole celych cisel: %d", pole[4]);'' ===== Pointery (ukazatele) ===== Pointery jsou velmi podobné normálním proměnným, ale jejich hodnotou je nějaká adresa v paměti. Adresu můžeme z normálních proměnných získat přidáním referenčního operátoru **&** před danou proměnnou (takto ji můžeme například předat ukazateli). K přístupu k hodnotám na dané adrese pak slouží operátor dereference *****. ==== Deklarace ==== Pointery využívají podobné deklarace jako normální proměnné, za jejich typ je však připojen znak *****. Využívá se tedy formy **typ* identifikátor**: ''char* ukazatel;'' Pro (dynamickou) deklaraci je také důležitá funkce **malloc()**. Touto funkcí lze alokovat místo v paměti (bez alokace ukazuje pointer na **NULL** kvůli ochraně skryté paměti). K alokaci využíváme konverzi na zvolený typ pointeru (malloc vrací **void***) a pro univerzálnost i **sizeof()**: ''ukazatel = (char*) malloc(sizeof(char));'' Uvolnění paměti provádíme funkcí **free()**, které musíme předat adresu ukazatele. ===== Propojení pole a ukazatele ===== Mezi polem a ukazatelem je velmi úzký vztah – jsou teoreticky zaměnitelné. ==== Součet ukazatele a celého čísla ==== Pokud k pointeru přičteme celé číslo, posune se nám jeho adresa o stejný počet hodnot zvoleného typu dále (například pro ukazatele **int*** by došlo k posunu o čtyři bajty). Dereferencí pak můžeme s pointery pracovat podobně jako s polem (dokonce lze využít i zápis s hranatými závorkami). ==== Dynamická alokace dvojrozměrného pole ==== Ukazatel na začátek pole se dá díky výše zmíněnému přičítání využít přímo jako pole. Dvojrozměrné **[10][10]** pole znaků bychom tedy vytvořili takto (vynechána kontrola návratu **NULL**, která by se měla ošetřit pomocí **free()**): ''char* * array;'' ''array = (char* *) malloc(10 * sizeof(char*));'' ''for (i = 0; i < x; i++) { array[i] = (char*) malloc(10 * sizeof(char)); }''