Table of Contents

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řesuňte tento výpis do vlastní funkce. Je zde nějaký problém?
  4. Implementujste stejnou funkcionalitu pomocí jednorozměrné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

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