{{indexmenu_n>6}} ====== 5 - Pole a ukazatele ====== * [[courses:b0b36prp:internal:tutorialinstruction:05|pro vyučující]] ===== Cíle cvičení ===== - 1D pole - Ukazatel, reference ''&'' a dereference ''*''. - Pointerová aritmetika. ===== Pole ===== - Napište program, který provede inicializaci 1D pole. Velikost pole zadána v programu, případně během kompilace. - Pole naplňte celými čísly ze standardního vstupu do kapacity pole. - Doplňte program tak, aby prošel pole cyklem a vypsal jednotlivé prvky pole. Zkuste napsat cyklus tak, aby program vypsal pole ve více sloupcích. - Napište funkci, která vypíše prvky pole, které je jejím argumentem. Funkci implementujte v přechozím programu. ===== Pointery a jejich aritmetika ===== ==== Adresní operátor a nepřímý přístup k paměti ==== Určete výstupy následujících výpisů a ověřte implementací a spuštěním programu. int x = 10; // Celočíselná proměnná x int *px = &x; // Proměnná typu ukazatel na proměnnou typu int, inicializovaná na printf("px = %p\n", px); // Tisk hodnoty ukazatele printf("*px = %d\n", *px); // Tisk hodnoty uložené na adrese, kterou ukazatel obsahuje ++++ Otázky k diskuzi | * Proč se hodnota ''px'' mění při každém spuštění? ++++ char c = 10; // Definice proměnné c typu char int x = 10; // Definice proměnné x typu int int *px = &x; // Definice proměnné px typu ukazatel na proměnnou typu int char *pc = &c; // Definice proměnné pc typu ukazatel na proměnnou typu char printf("sizeof(c) = %ld (%ld)\n", sizeof(c), sizeof(char)); // Tisk paměťové velikosti proměnné c a typu char printf("sizeof(x) = %ld (%ld)\n", sizeof(x), sizeof(int)); // Tisk paměťové velikosti proměnné x a typu int printf("sizeof(px) = %ld (%ld)\n", sizeof(px), sizeof(int*));// Tisk paměťové velikosti proměnné px a typu int* printf("sizeof(pc) = %ld (%ld)\n", sizeof(pc), sizeof(char*));// Tisk paměťoé velikosti proměnné pc a typu char* printf("px: %p\n", px); // hodnota ukazatele px (adresa x) printf("pc: %p\n", pc); // hodnota ukazatele pc (adresa c) printf("(pc - px) = %ld\n", (pc - (char*)px)); // rozdíl adress ++++ Otázky k diskuzi | ''int'' zabere víc místa v paměti než ''char''. * Proč velikost adresy na proměnné typu ''int'' a ''char'' mají stejnou velikost? * Jak kompilátor ví, kolik paměti má očekávat (při čtení či zápisu) při derefernci ''*px''? * Proč se poslední výpis nemění? ++++ int x; // definice proměnné typu int (o velikost 4 bajty). char *pcx = (char*)&x; // definice proměnné typu ukazatel na char, inicializace adresou, kde je uložena proměnná x. pcx[0] = 'a'; pcx[1] = 'b'; pcx[2] = 'c'; pcx[3] = '\0'; printf("x = %d\n", x); printf("&x = %p\n", &x); printf("&x = %s\n", &x); ++++ Otázky k diskuzi | * Co je hodnotou proměnné ''x''? Číslo nebo pole znaků? ++++ ==== Pole a ukazatele ==== * Implementujte program, který alokuje pole hodnot celých čísel o velikosti N = 10. * Pole incializujte náhodnými hodnotami v rozsahu 0 až 99, využitjte funkce ''rand()'' ze ''stdlib.h''. * Pole vytiskně na ''stdout'' ve formě "Array address %p\n" a následně jednotlivé prvky na samostatném řádku ve formátu "array[%d] = %d, adress %2lu", kde první číslo je index (pořadí) prvku pole, druhé je hodnota prvku, a třetí je adresa prvku v paměti. * Inicializaci a tisk pole dekomponujte do samostatných funkcí. * //Tiskně pole před a po inicializaci.// * //Během implementace si vyzkoušejte tisk velikost proměnné pole v bloku její definice a ve funkci.// ++++ Příklad výstupu | Array address 0x8209ab0f0 array[0] = 91, relative address 0 array[1] = 10, relative address 4 array[2] = 93, relative address 8 array[3] = 18, relative address 12 array[4] = 56, relative address 16 array[5] = 44, relative address 20 array[6] = 57, relative address 24 array[7] = 92, relative address 28 array[8] = 13, relative address 32 array[9] = 84, relative address 36 Array address 0x820ff2ba0 array[0] = 91, relative address 0x00 array[1] = 10, relative address 0x04 array[2] = 93, relative address 0x08 array[3] = 18, relative address 0x0c array[4] = 56, relative address 0x10 array[5] = 44, relative address 0x14 array[6] = 57, relative address 0x18 array[7] = 92, relative address 0x1c array[8] = 13, relative address 0x20 array[9] = 84, relative address 0x24 ++++ ==== Další úkoly na procvičení (na doma) - pointerová aritmetika ==== - Určete výsledek a ověřte programem: int array[] = {5, -6, 0, 8, -9, 3, 1, -4}; int *up = array; int **uup = &up; printf("array[1] = %d \n", array[1]); printf("array[1] + 4 = %d \n", array[1] + 4); printf("(array + 1)[2] = %d \n", (array + 1)[2]); printf("*up = %d \n", *up); printf("*up + 4 = %d \n", *up + 4); printf("*(up + 1) = %d \n", *(up + 1)); printf("**uup = %2d \n", **uup); printf("*(*uup + 2) = %2d \n", *(*uup + 2)); printf("**uup + 4 = %2d \n", **uup + 4); ==== Kódy ze cvičení ==== * 2025 par. 204, lab05 - {{ :courses:b0b36prp:labs:2025-p204-lab05.zip |}}