Table of Contents

5 - Pole a ukazatele

Cíle cvičení

  1. 1D pole
  2. Ukazatel, reference & a dereference *.
  3. Pointerová aritmetika.

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. Zkuste napsat cyklus tak, aby program vypsal pole ve více sloupcích.
  4. 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

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