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