Asi budu vypadat jako že si chci akorát rejpnout, ale v základech jazyka C opravdu, ale opravdu tápeš. Ušetřil by sis spoustu času, kdyby sis pořídil nějakou normální učebnici jazyka C (Heroutova Učebnice jazyka C by nemusela být špatnou volbou) a celou si ji pročetl, včetně vypracování úkolů. Protože jinak se tu budeš stále dokola ptát na základní věci a programovat stejně neohrabaným způsobem, jako to ukazuješ na svém příkladu (nejen, že tam máš tu chybu, ale takhle se to fakt nedělá; ne že by to bylo vyloženě špatně, ale přesně totéž, co jsi napsal, dělá operátor indexace - hranaté závorky; druhá možnost je použití dereference s dekrementací - např. *ptr--, která může být rychlejší v závislosti na schopnostech překladače a použité architektury).
Taky naprosto tápeš (jako spousta začátečníků) v syntaxi deklarací a matláš tam zbytečné závorky, které to celé akorát znepřehledňují. Takže věz, že při zápisu/čtení deklarací se postupuje od deklarovaného objektu nejdřív doprava a pak od něj doleva, respektuje přitom kulaté závorky. Takže obklopit závorkami jen samotný deklarovaný identifikátor je asi tak stejně smysluplné, jako v matematickém výrazu dát do závorky jedno nezáporné číslo.
Příklad:
int *x[]
1. "x" je... (postupuju dále doprava)
2. ...pole... (napravo už nic není, takže pokračuji od "x" směrem doleva)
3. ...ukazatelů... (jdu dále doleva)
4. ...na "int". (hotovo)
int (*x)[]
1. "x" je... (postupuji doprava, ale narážím na závorku, takže se obracím doleva)
2. ...ukazatel (postupuju dále doleva, ale narážím na levou závorku, takže pokračuju od pravé závorky dále doprava)
3. ...na pole (napravo už nic není, takže jdu od levé závorky dále doleva)
4. ..."int"ů. (hotovo)
int *x()
1. "x" je...
2. ...funkce...
3. ...vracející ukazatel...
4. ...na "int"
int (*x)()
1. "x" je...
2. ...ukazatel...
3. ...na funkci...
4. ...vracející "int"
atd...
Taky mechanické používání referenčního operátoru svědčí o naprostém nepochopení jeho smyslu - C používá jen předávání proměnné hodnotou, takže v některých případech je třeba předat ukazatel na samotnou proměnnou místo pouhé kopie její hodnoty, a to pomocí referenčního operátoru &. Jenže když nějaká proměnná sama o sobě již ukazatelem je už jaksi ze své podstaty - jako třeba pole, tak je použití další reference zbytečné, v 99% případů samozřejmě nezamýšlené a tím pádem chybné. Dále, argumenty se funkci neposílají, ale předávají. V OOP se posílají zprávy objektům. Ale to všechno jsou základy, které se dají vyčíst z jakékoli učebnice.