Ciele cvičenia
Cvičenie je zamerané na prácu so smerníkmi, ktoré sú v programovaní C veľmi silným a užitočným nástrojom. Po osvojení si problematiky študent dokáže efektívne adresovať údaje v pamäti. Rozlišuje medzi adresou premennej a jej obsahom.
- Hodnota, adresa a smerník
- Smerník ako argument funkcie
- Smerník a polia - reťazce
- Smerníková aritmetika
Odporúčaná literatúra a dôležité odkazy
[1] KPI-FEI-TUKE: Prednáška č. 1
[2] KPI-FEI-TUKE: Cvičenie č. 2 - *Pointers
[3] Horovčák P.: Úvod do programovania v jazyku C- Smerníky
Smerník ako argument funkcie
Na ZAP sme sa naučili, že výsledok vykonania ľubovoľnej funkcie môže byť vrátený pomocou jej návratovej hodnoty. K tomuto účelu slúži príkaz retrun, ktorý je spravidla posledným príkazom vykonaným volanou funkciou. Mnoho funkcií ale je typu void, teda bez návratovej hodnoty a stále dokážu "vrátiť" výsledok, napr. tak ako už spomínaná funkcia scanf.
Funkciu bez návratovej hodnoty, ktorej výsledky potrebujeme ďalej používať musí teda pracovať s premennými v pamäti presne tam, kde ich používa aj funkcia (napr. main), ktorá danú funkciu zavolala. Toto zabezpečíme tak, že vstupnými argumentom funkcie bude priamo adresa premennej, do ktorej sa má výsledok uložiť.
V nasledujúcom príklade si ukážeme jednoduchú funkciu, ktorá vynásobí číslo, ktoré jej bude zaslané hodnotou "-1". Teda v prípade kladného čísla dostaneme číslo záporné a naopak v prípade záporného čísla zasa vo výsledku dostaneme číslo kladné. Takúto funkciu si ukážeme v dvoch prevedeniach - s návratovou hodnotou a bez nej.
Funkcia invertovania s návratovou hodnotou
#include <stdio.h> int invert(int cislo); int main() { int a = 5; int b = invert(a); // Do b je uložená návratová hodnota funkcie. printf(" >> b = -1 x a = -1 x %d = %d\n", a, b); return 0; } int invert(int cislo) { return -1*cislo; }
Funkcia invertovania bez návratovej hodnoty
#include <stdio.h> void invert(int* cislo); int main() { int a = 5; int b = a; // Do b je skopíprovaná hodnota z premennej a invert(&b); // Funkcii invert sa pošle iba adresa premennej b printf(" >> b = -1 x a = -1 x %d = %d\n", a, b); return 0; } void invert(int* cislo) { *cislo = *cislo * (-1); // cez *cislo sa dostaneme na obsah, ktorý sa nachádza na adrese, ktorú funkcia dostala }