You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

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

[4] Základy práce s knižnicou STDIO.H

[5] Reťazce v jazyku C


Čo je to smerník?

So smerníkmi sme sa už pri programovaní (na ZAP) takmer určite stretli. Spomínate si na funkciu scanf? Táto funkcia slúži na načítanie znakov z terminálu. Ak si spomíname tak volanie tejto funkcie vyzeralo nejako takto: scanf("%c", &znak) alebo scanf("%s", retazec). Na ZAP sme len konštatovali, že Funkcia scanf() pracuje s "miestom" v pamäti teda adresou premennej a nie s jej hodnotou [4] a preto ak načítavame jeden znak musíme použiť &. Neskôr sme si tiež povedali, že ak načítavame reťazce tak & nepoužívame [5].

Z uvedeného je teda zrejmé, že ak pred názov premennej dáme znak & odkazujeme sa na adresu tejto premennej. V prípade polí (teda aj reťazcov) to ale neplatí! Pri poliach sa za adresu (ide o adresu prvého prvku poľa) považuje samotný názov tohto poľa a k jeho prvkom sa potom pristupuje cez indexáciu v hranatých zátvorkách.

Smerník je údajový typ, ktorým ukazujeme na miesto v pamäti teda na adresu. Ak teda deklarujeme premennú pred ktorú dáme znak *  dáme prekladaču najavo, že v tejto premennej budú uložené adresy na premenné. 

Nasledujúcim kódom je demonštrovaný vzťah medzi adresou premennej, jej obsahom a smerníkom na túto premennú 

#include <stdio.h>
int main()
{
  int a = 5;        // Priradenie hodnoty 5 do premennej a.
  int* ptr_a = &a;  // Priradenie adresy prem. a do ptr_a. 
					// (typ smernik)	
  int c = *ptr_a;   // Priradenie obsahu do prem c.
					// Tento obsah sa nachádza na adrese kam 
					// ukazuje smerník ptr_a.   
  printf(">> a = %d \n", a);  
  printf(">> *ptr_a = %d \n", *ptr_a);
  printf(">> ptr_a = %p \n", ptr_a);
  printf(">> &a = %p \n",  &a);
  printf(">> c = %d \n", c);
  return 0;
}

Po kompilácii a spustení kódu:

ab123cd@zapfei:CV1$ gcc ptr.c -o PTR
ab123cd@zapfei:CV1$ ./PTR
>> a = 5
>> *ptr_a = 5
>> ptr_a = 0x7ffdebd89bf8
>> &a = 0x7ffdebd89bf8
>> c = 5



  • No labels