Riešenia


Úloha 1

Ukazovateľ je vždy zviazaný s typom, ktorého premenné sprístupňuje, na ktoré ukazuje. Nemôže ukazovať na premenné iného než svojho doménového typu uvedeného v deklarácii. Podľa neho totiž počítač pri dereferencii "vie", koľko bajtov od príslušnej adresy má prečítať a ako ich interpretovať. Pointer p je však pointer na void. Môže ukazovať na premenné ľubovoľného typu. Nemá žiadnu informáciu o tom, koľko bajtov má premenná na ktorú ukazuje t.j. akého je typu. Bez pretypovania predstavuje len adresu nejakého pamäťového miesta, operátor dereferencie naň nie je možné preto použiť.


Úloha 2

int memcmp(void *m1, void *m2, int dlzka)
{
    char *c1 = (char*)m1;
    char *c2 = (char*)m2;
       
    for( ; dlzka>0; dlzka--) 
       if (*c1++ != *c2++) return (0);

    return (1);
}
Funkcia vráti 0, ak sú dané úseky pamäte rôzne, 1 ak sú rovnaké.

Stručný "céčkovský" zápis *c1++ != *c2++ môžeme rozpísať. Telo cyklu for bude potom vyzerať takto:

if (*c1 != *c2) return (0);  Porovnaj obsahy premenných, na ktoré tieto pointery ukazujú.
c1++;  Posuň pointer c1 v pamäti o jeden bajt ďalej.
c2++;  Posuň pointer c2 v pamäti o jeden bajt ďalej.


Úloha 3

Chyba je v príkaze *z = 600;.

Operátor dereferencie nemôžeme použiť na void pointer! Pointer z je nutné najskôr pretypovať! Správne má byť:

*(int*)z = 600;


Úloha 4

Chyba je v príkaze int y = *((int*)v[1]);.

Prvku poľa v[1] sme priradili na začiatku adresu premennej typu double a tu s ňou zrazu chceme pracovať ako s premennou typu int!