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!