*Pointers

It’s all about pointers…

Motivácia

Pokiaľ chcete naozaj rozumieť programovaniu v jazyku C, musíte porozumieť tomu, čo všetko sa deje s vašimi údajmi a programom na pozadí. Častokrát totiž nestačí len vedieť, že údaje sa nachádzajú niekde v pamäti, ale častokrát potrebujete k tým údajom pristupovať na základe ich adresy. Dnes sa pozrieme bližšie na prácu so smerníkmi.

Poznámka

Samotné príklady na tomto cvičení nebudú reprezentovať ideálne riešenia alebo postupy, ale budú slúžiť len pre osvojenie si predmetnej problematiky.

Ciele

  1. Naučiť sa nové možnosti použitia nástroja cgdb.
  2. Naučiť sa pracovať s operátorom referencie &.
  3. Naučiť sa pracovať s operátorom dereferencie *

Postup

Know Your Enemy

V tomto kroku vytvoríte jednoduchý program na výpočet obsahu štvorca. Popri tom sa naučíte niekoľko noviniek pri používaní nástroja cgdb a zoznámite sa s operátormi referencie a dereferencie.

Úloha

Vytvorte súbor square.c a vložte do neho nasledujúci kód pre výpočet obsahu štvorca.

Kód pre, ktorý použijete pre experimentovanie, je tento:

#include <stdio.h>

double square(const double a){
    double result = 0;
    result = a * a;
    return result;
}

int main(){
    double a;

    printf("Enter the side of square: ");
    scanf("%lf", &a);

    double result = square(a);
    printf("The result is: %.3f\n", result);
}

Úloha

Preložte, spustite a otestujte kód.

Ak ste pri prepisovaní alebo kopírovaní neurobili chybu, program sa spustí a pri zadaní strany o veľkosti 10 vypíše hodnotu 100.

Úloha

Vytvorte premennú p_result, ktorá bude smerníkom na premennú result.

Začnite správnou deklaráciou premennej p_result. To, či ste správne priradili jej hodnotu, si môžete overiť buď kontrolným výstupom alebo pomocou nástroja cgdb.

Úloha

Po vypísaní výsledku ešte vypíšte adresu, hodnotu a veľkosť zaberaného miesta v pamäti premnných result a p_result.

Výstup by teda mohol vyzerať nasledovne:

The address of result is:       0x7ffff2a5abf8
The address of p_result is:     0x7ffff2a5abf0
The value of result is:         100.000000
The value of p_result is:       0x7ffff2a5abf8
The value of *p_result is:      100.000000
The size of result is:          4 bytes
The value of p_result is:       8 bytes

Swap (Again)

Funkcia swap na výmenu obsahu dvoch premenných. Znova. Tentokrát okrem dvoch celých čísiel vymení aj obsah dvoch reťazcov.

Úloha

Vytvrote súbor swaps.c a vložte do neho nasledujúci kód.

Kód programu:

#include <stdio.h>

void swap_nums(int *n1, int *n2) {
    int tmp;
    tmp = *n1;
    *n1 = *n2;
    *n2 = tmp;
}

void swap_strings(char *str1, char *str2) {
    char *tmp;
    tmp = str1;
    str1 = str2;
    str2 = tmp;
}

int main() {
    // swap numbers
    int a = 30;
    int b = 40;
    swap_nums(&a, &b);
    printf("a is %d\n", a);
    printf("b is %d\n", b);

    // swap strings
    char *s1 = "First string";
    char *s2 = "Second string";
    swap_strings(s1, s2);
    printf("s1 is %s\n", s1);
    printf("s2 is %s\n", s2);
}

Úloha

Program preložte a spustit.

Úloha

Funkcia na výmenu reťazcov nefunguje správne a preto ju opravte.

Overte si jej správanie pomocou nástroja cgdb. Všimnite si, ako je to s výmenou parametrov vo funkcii swap_nums(), ako sú predávané adresy pomocou parametrov a následne porovnajte toto správanie vo funkcii swap_strings().

Additional Resources