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).