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