C -ben, hogyan kell tömböt csinálni?





int i[64];
Ez egy 64 tagó inteket tartalmazó tömb.
A pointer egy olyan változótípus, ami memóriacímet tud tárolni.





Tömb deklarációja:
int szamok[5]; /* ez egy int értékekből álló 5 elemű tömb, a neve az hogy szamok */
A pointer pedig memóriacímet tárol, memóriacímre mutat. Ez tulajdonképpen egy szám, amely speciális jelentéssel bír.
A tömbök és a mutatók kapcsolata pedig a következő:
A tömb neve (a példában "szamok") valójában egy pointer, amely a tömb kezdőcímére mutat. Amikor a tömböt indexeljük, akkor ezzel valójában ezt a memóriacímet toljuk el az adott indexszel.
Pl.: szamok[1] // a tömb 1. eleme (a 0. utáni)
szamok+1 // a tömb 1. elemének a címe a memóriában
Ennyi dióhéjban, persze ennél jóval többről van szó, de remélhetőleg a kérdésedre ez választ adott.





"A tömb neve (a példában "szamok") valójában egy pointer, amely a tömb kezdőcímére mutat."
Ez nagyon nem igaz. Csak implicit konvertálódik a tömb neve az első elemére mutató pointerré. De az egy tömb.





iostream
Akkor mi a lényegi különbség a két deklaráció között?










char a[10];
char *b;
b = (char*)malloc(10);
Minkettő alkalmas 10 `char` tárolására. Csak kíváncsi voltam, mi a különbség a kettő között. És az hogy az egyik tömb, a másik meg pointer, válasznak eléggé gyenge :)










Sejtettem, hogy megint csak kötekedni jöttél :D
...
char a[10000000];
printf("%d\n", sizeof(a));
...
===> Segmentation fault
...
char *a = (char*)malloc(100000000);
printf("%d\n", sizeof(a));
...
===> 8
miért is?!?










Nem kötekszem, rejtett a különbség, de létezik. Csak a nyelv NAGYON csendben konvertálja a tömbnevet pointerré.
A tömb sizeofja a tömbelemek száma szorozva a méretükkel, a pointer sizeofja pedig a pointer mérete, ami a te rendszereden épp 8, tehát 64 bites a rendszered.
A klasszikus példa, hogy miért nem ugyanaz, próbáld ki: két fordítási egységed van, az egyikben megadsz egy int tömböt, a másikban pedig extern int*-ként húzod be a nevet, majd ott egy függvényben használni akarod. Olyan segfault lesz, hogy öröm nézni. Teljesen máshogy éri el egy tömb elemét, mint ahogy egy pointert dereferál.
Kapcsolódó kérdések:
Minden jog fenntartva © 2025, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!