*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.

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, s ktorým budete experimentovať:

#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:          8 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 = *n1;
    *n1 = *n2;
    *n2 = tmp;
}

void swap_strings(char *str1, char *str2) {
    char *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 spustite.

Ú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

  • Week 01 - prvá prednáška venujúca sa problematike smerníkov

  • Debugging - Základy práce s nástrojom cgdb, ladenie programov, polia, operátor sizeof