Kezdőoldal » Számítástechnika » Programozás » C -ben, hogyan kell tömböt...

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

Figyelt kérdés
És mi az a mutató (pointer)?
2012. aug. 21. 19:38
1 2
 1/11 anonim ***** válasza:

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.

2012. aug. 21. 19:41
Hasznos számodra ez a válasz?
 2/11 anonim ***** válasza:

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.

2012. aug. 21. 19:51
Hasznos számodra ez a válasz?
 3/11 iostream ***** válasza:
0%

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

2012. aug. 21. 21:48
Hasznos számodra ez a válasz?
 4/11 _Jessy_ ***** válasza:

iostream

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

2012. aug. 22. 11:16
Hasznos számodra ez a válasz?
 5/11 iostream ***** válasza:
0%
Milyen két deklarációról beszélsz? :)
2012. aug. 22. 13:41
Hasznos számodra ez a válasz?
 6/11 _Jessy_ ***** válasza:

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

2012. aug. 22. 13:49
Hasznos számodra ez a válasz?
 7/11 iostream ***** válasza:
0%
Pedig ez a válasz... Próbálj sizeofot hívni rá.
2012. aug. 22. 14:31
Hasznos számodra ez a válasz?
 8/11 _Jessy_ ***** válasza:

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?!?

2012. aug. 22. 20:07
Hasznos számodra ez a válasz?
 9/11 _Jessy_ ***** válasza:
Elírtam. malloc(100000000) akart lenni.
2012. aug. 22. 20:08
Hasznos számodra ez a válasz?
 10/11 iostream ***** válasza:
0%

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.

2012. aug. 22. 22:23
Hasznos számodra ez a válasz?
1 2

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!