Riešenia

Úloha 1

p1 = &i;pointer p1 ukazuje na premennú i
scanf("%d", &i);do premennej i sa prečítala hodnota zo vstupu
scanf("%d", p2);p2 je adresa premennej j, prečítaná hodnota sa uložila do premennej j
*p1 = 22;premenná i má hodnotu 22
printf("%p %p %d\n", &p1, p1, *p1);vypísala sa adresa pointera p1, hodnota p1 t.j. adresa premennej i, hodnota premennej i
printf("%p %d \n", &j, j);vypísala sa adresa premennej j, hodnota premennej j
p2 = p1;p2 ukazuje na premennú i
k = *p2 + 1;premenná k má hodnotu 23
p1 = NULL;pointer p1 neukazuje nikam (má hodnotu NULL)

Úloha 2

Po vykonaní danej sekvencie príkazov dostaneme tieto výsledky:

*Koruna  == 120
*Euro  == 120
*Dolar  == 240


Úloha 3

a)

Premenná x je pointer na int. Nemôže ukazovať sám na seba, ako by sa zdalo z uvedeného kódu. Ak chceme uložiť adresu tohoto pointera, je lepšie na to použiť premennú typu pointer na pointer na int. Na pointery sa totiž nemôžeme pozerať ako na celé čísla, hoci sa s nimi vlastne pracuje rovnako. Kompilátor by pri pôvodnom priradení zrejme vyhlásil len varovanie o nekompatibilných typoch, úplne správne je však takéto riešenie:

int main() 
{
   int *x;
   int **p_x;
   p_x = &x;
   return (0);
} 

b)  

Pointer p ukazuje na náhodné miesto v pamäti! Ak naň použijeme operátor dereferencie, budeme pracovať s úsekom pamäte, ktorý nám nepatrí, a program takmer určite skončí chybou. Pointer je nutné pred použitím inicializovať adresou nejakej premennej. Jedno z možných správnych riešení je:

int main()
{
   int a, *p = &a;
   *p = 100;
   printf("%d\n", *p);
   return (0);
}

 Uvedený príklad už na prvý pohľad nie je veľmi praktický, niekomu sa môže zdať úplne nezmyselný. V ďalších kapitolách sa dozviete, že pamäť sa dá prideliť aj dynamicky (počas vykonávania programu)! Vtedy sa k nej iným spôsobom ako prostredníctvom smerníkov nedostaneme. Je však jedno akým spôsobom smerník inicializujeme (to napokon závisí od problému, ktorý riešime), hlavne aby sme na to nezabudli :-)


Úloha 4

a)

Aj keď riadok

a = *&*&*&*&a;

pôsobí podozrivo, všetko je v poriadku. Pozrime sa na to bližšie:

&a je adresa premennej a. Použitím operátora dereferencie na adresu t.j. zápisom *&a dostaneme opäť premennú a. Jej adresa je &(*&a), čo je to isté ako &*&a. Výraz *(&*&a), čo je to isté ako *&*&a je teda opäť len premenná a atď. Na výstupe tak bude hodnota premennej a a tá je rovná 5.

b)  

Výraz &&a nemá žiadny zmysel. Hovorí totiž toto: "Vezmi adresu premennej a. Potom vezmi adresu tejto adresy ... " A tu je ten problém. Adresa premennej a je číslo, nemá adresu, nemá totiž v pamäti vyhradené miesto. Kompilácia preto skončí chybou.