Bardzo mnie cieszy, że masz takie pytania. :)
To może po kolei, bo iwan9449 nie do końca wyjaśnił wszystko, jak trzeba. ;)
1. na czym polega różnica pomiędzy operacjami *p++ oraz (*p)++.
Operacja (*p)++ najpierw dereferuje wskaźnik, a potem zwiększa otrzymaną wartość o jeden. Wskaźnik nie przesuwa się w wyniku tego działania.
Operacja *p++ najpierw zdereferuje wartość, a potem przesunie adres o jedną "komórkę wyżej" (tak naprawdę rzeczywista wartość przesunięcia jest zależna od typu zmiennej wskaźnikowej).
2. co robi ta funkcja : void funkcja(char *s, char *t){ while(*s++ = *t++); }
Ta funkcja to taki typowy C-misz-masz. Zamiast jakoś czytelnie zapisać, to programiści stosowali takie twory i potem ludzie myśleli "co to jest? Ten język C musi być strasznie trudny, nic nie rozumiem"... ;)
Nie robi ona nic specjalnego - ot przepisuje łańcuch znaków t do łańcucha znaków s. Wszystko dzieje się w instrukcji sterującej pętlą, gdzie najpierw jest robiona dereferencja, wartości są zapamiętywane. Przesuwane są wskaźniki, następnie wykonywane jest przypisanie odczytanych chwilę wcześniej wartości. Na sam koniec sprawdzany jest warunek, a za warunek robi tutaj wartość przepisanej zmiennej - która jest rzutowana na wyrażenie logiczne: jeśli jest tam znak zerowy, to wyrażenie jest fałszywe i pętla się kończy, jeśli nie - powtarzamy procedurę do znudzenia. ;)
Trzecie dobrze wyjaśnił iwan9449, a co do czwartego, to sam nie jestem w tej chwili pewny wszystkich opcji. ;D Kiedy się upewnię, dam Ci znać. :)