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