Lab 05 - Pole a ukazatele

Cíle cvičení

  1. pole (jedno i vícerozměrná)
  2. Ukazatel, reference & a dereference *
  3. Pointerová aritmetika

Pole

1D pole

  1. Napište program, který provede inicializaci 1D pole. Velikost pole zadána v programu, případně během kompilace.
  2. Pole naplňte celými čísly ze standardního vstupu do kapacity pole.
  3. Doplňte program tak, aby prošel pole cyklem a vypsal jednotlivé prvky pole. Napište cyklus tak, aby vypsal pole ve více sloupcích. Počet sloupců je zadán uživatelem.
  4. Výpis pole do sloupců přesuňte do vlastní funkce.

Vícerozměrná pole

  1. Napište program, který provede inicializaci dvourozměrného pole a zaplní ho čísly tak, aby v každé buňce byl násobek čísla řádku a čísla sloupce.
  2. Vytiskněte bosah tohoto pole na standardní výstup.
  3. Přeuňte tento výpis do vlastní funkce. Je zde nějaký problém?
  4. Implementujste stejnou funkcionalitu pomocí jednorozměfrného pole.
  5. Napište inicializaci třírozměrného pole. Buňky zaplňte podobným způsobem.
  6. Jak by vypadala funkce pro výpis obsahu takovéhoto pole?

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);
    printf("*px = %d\n", *px);

Otázky k diskuzi

    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));
    printf("sizeof(x) = %ld (%ld)\n", sizeof(x), sizeof(int));
    printf("sizeof(px) = %ld (%ld)\n", sizeof(px), sizeof(int*));
    printf("sizeof(pc) = %ld (%ld)\n", sizeof(pc), sizeof(char*));
 
    printf("px: %p\n", px);
    printf("pc: %p\n", pc);
    printf("(pc - px) = %ld\n", (pc - (char*)px));

Otázky k diskuzi

    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

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

Další úkoly na procvičení (na doma) - pointerová aritmetika

  1. 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);

courses/b3b36prg/labs/lab05.txt · Last modified: 2026/02/23 14:06 by herynjac