Hirdetés

Új hozzászólás Aktív témák

  • dobragab
    addikt

    "A tömb pedig ekvivalens a pointerrel"

    Na na! Csak óvatosan! Pointernek adhatsz értéket, tömbnek nem. Ez egy igen lényeges különbség. A tömb, mint cím, fordítás idejű konstans, míg a pointer egy változó, ami futás időben kap értéket. Pointernek veheted a címét (hiszen változó), tömbnek pedig nem (mármint char array[10]; char **p=&array; utasításoknak nincs értelme, míg char *p; char **pp=&p; -nek pedig van). Az, hogy a C-ben és C++ -ban szemantikailag nincs eléggé megkülönböztetve a pointer és a tömb, az a nyelv egyik hiányossága, amellett, hogy nagyfokú rugalmasságot is biztosít.
    C++ -ban például teljesen helyénvaló származtatott osztály pointert (D *) publikus ősosztály pointerként (B *) használni, míg D ** pointer B ** pointerként való használata tiltott, nyilvánvaló okok miatt. Ugyanakkor nyugodtan meg lehetne engedni D *[] típusú változó B *[]-ként való használatát, azonban ezt mégsem lehet, mivel nincs eléggé megkülönböztetve a pointer és a tömb.

    Jól mondod.

    Az egyszerűség kedvéért úgy is lehet definiálni, hogy a tömbön mint típuson két művelet értelmezett:
    - sizeof
    - automatikus konverzió, ami a tömb első elemére mutató pointerré konvertálja

    Ebből minden más, tömbökre jellemző tulajdonság levezethető:
    - indexelni is "csak" a pointert tudjuk, az indexelés meg ugye ekvivalens egy címszámítással és egy dereferálással
    - a tomb + 5 kifejezés nem azt jelenti, hogy a tömbhöz adunk ötöt, hanem az elejére mutató pointerhez, azaz a tömb ötödik elemére mutató pointert jelenti
    - *tomb egy dereferálás, mégpedig a tömb első elemét jelenti
    - a címét nem képezhetjük, hiszen ahhoz először pointerré konvertálódik, az így keletkezett temporális objektumnak nem képezhető a címe
    - tömbnek nem adhatunk értéket, hiszen a konverzió eredménye temporális objektum, ami C-ben nem balérték
    - függvényparaméterként csak úgy adhatjuk át, hogy előtte pointerré konvertálódik
    - ha struktúrába rakod, a neki lefoglalt hely természetesen sizeof(tomb) lesz

Új hozzászólás Aktív témák