No zmatok tam nie je ziadny. Treba pochopit pointrovu matematiku a pracu s pamatou, bez toho sa v Ccku nikam nedostanete.
To sa musite naucit hned po tom ako zistite na co je main, for, if, else a while. Alokovanie a dealokovanie pamate a v C si mozete vytvorit bez problemov aj smernik na zakladny typ. Proste je to absolutne zakladna sucast znalosti jazyka C.
Pokial prechadzate z jazyka ktory ma GC moze vam to pripadat cudne ale to nie je chyba jazyka C.
Medzi C a go je skoro 40 rokov. Tvorcovia go mali prístup k neporovnateľne rozsiahlejšej báze znalostí. Nečítal som o histórii vzniku C ale nechce sa mi veriť, že keď sa pri návrhu rozhodli pre odovzdávanie parametrov hodnotou, že by to nezvažovali aj pre polia. Ale hodnotová sémantika znamená kopírovanie a v tej dobe bol hardvér oveľa slabší ako teraz a pamäť bola vzácna, tak to asi vzali ako rozumný kompromis.
tak treba ze sizeof() se bude dost zasadnim zpusobem lisit. Cecko totiz pole v compile time zna, umi spocitat jejich velikost, rozlisit typ dvou poli se stejnymi typy prvku atd. atd.
a samozrejme pointerova aritmetika (resp.pointerove operatory) s poli nebudou presne funguovat (takove x++ apod.).
9. 6. 2023, 08:22 editováno autorem komentáře
No a to je ta nekonzistence, si zkuste co na zacatku zmate kazdeho
#include <stdio.h> int main(void) { char x2[] = {1,2,3}; char *x1=x2; /* u vsech ostatnich typu se vyzaduje &x2 */ printf("%p %p\n", x1, x2); /* tvarime se ze pole a pointer je to same */ printf("%d %d\n", x1[0], x2[0]); /* nechteny dusledek x[y] = *(x+y) = *(y+x) = y[x] */ printf("%d %d\n", 0[x1], 0[x2]); x1++; /* ovsem x2++; nelze */ printf("%p %p\n", x1, x2); printf("%d %d\n", x1[0], x2[0]); return 0; }
ano, je to tak (a ma to dalsi dusledek - free(x2)
uz bude legalni, kdyby tam jen visel nekonstantni pointer, tak neni jistota, co se stane).
Ta druha nekonzistence byla v tom tvrzeni, ze pole jde priradit do pointeru (u jinych typu byste to asi u pohovoru nerekl bez uzardeni ne?) A tyto vety strasne matou lidi, co na C prechazi (protoze samozrejme jsou a soucasne i nejsou spravne).