WebHU - Programozási kérdések és válaszok

Mutató a mutatók tömbjére

Van egy int mutatók tömbje int* arr[MAX];, és a címét egy másik változóban szeretném tárolni. Hogyan határozhatok meg egy mutatót egy mutatótömbhöz? azaz.:

int* arr[MAX];
int (what here?) val = &arr;
25.05.2011

Válaszok:


1

Csak a következőnek kell lennie:

int* array[SIZE];
int** val = array;  

Nincs szükség cím-of operátor használatára a array-on, mivel a tömbök implicit mutatókká bomlanak a hozzárendelési operátor jobb oldalán.

25.05.2011
  • @moteustch Nos, kapott egy mutatót a tömb adataira, ami majdnem ugyanaz. 26.05.2011
  • Igen, a val egy mutató a int mutatók tömbjére (szemantikai értelemben) ... ha a val hivatkozást megszüntette, akkor ismét a mutatótömböt kapja, azaz megteheti a (*val)[INDEX] tömböt. Tehát mivel az val a címet egy int* tömb elejéhez tartja, akkor ez egy mutató egy mutatótömbre. 26.05.2011
  • @Ivella: Elmagyaráznád? Az OP megkérdezte, hogyan lehet mutatót definiálni egy mutatótömbhöz, és ez a válasz megmutatja az egyik legális C-kódnak tekintett módszert. 17.06.2015
  • A @Jason val nem egy mutató tömbjének mutatója. A val egy mutató a tömb első mutatójára. (*val)[INDEX] nem egyenértékű a array[INDEX]-vel. Ehelyett az val[INDEX] a array[INDEX]-nak felel meg. A val defrencálása csak az első mutatót adja a tömbben. Nem magyarázta el, hogyan lehet mutatót egy mutatótömbre tenni, de azt elmagyarázta, hogyan lehet egy mutatót egy tömb első mutatójává tenni. 09.07.2015
  • Szia @Jason, van referenciája a mivel a tömbök implicit mutatókká bomlanak le a hozzárendelési operátor jobb oldalán? 14.01.2020
  • @RafaelEyng itt nézheti meg ezt a választ 14.01.2020

  • 2

    A helyes válasz:

    int* arr[MAX];
    int* (*pArr)[MAX] = &arr;
    

    Vagy csak:

            int* arr  [MAX];
    typedef int* arr_t[MAX];
    
    arr_t* pArr = &arr;
    

    Az utolsó rész így szól: "a parArr egy pointer to int típusú MAX elemből álló tömb mutatója".

    C-ben a tömb mérete a típusban van tárolva, nem az értékben. Ha azt szeretné, hogy ez a mutató helyesen kezelje a mutató aritmetikáját a tömbökön (ha kétdimenziós tömböt szeretne készíteni ezekből, és ezt a mutatót használja az iterációhoz), gyakran sajnos – a tömbméretet be kell ágyazni a mutatótípusba.

    Szerencsére a C99 és a VLA-k óta (talán a C99-nél korábban is?) a MAX megadható futási időben, nem fordítási időben.

    25.05.2011

    3

    Az IIRC, a tömbök implicit módon pointerekké konvertálhatók, így a következő lenne:

    int ** val = arr;
    
    25.05.2011
  • Úgy gondolom, hogy ez hibázni fog a kompliterben a nem egyező típus miatt, mivel a arr valójában array-of-pointers-to-int` típusú, nem pedig pointer-to-int. 26.05.2011
  • A tömbök mutatóvá alakíthatók... De fordítva nem. És a Pointers-to-tömbök nem konvertálhatók implicit módon pointers-to-pointerekké. Et cetera, stb. 26.05.2011
  • De ha egy tömb mutatóvá alakítható, az eredeti arr nem ugyanaz, mint a int** arr? Tehát &arr int *** lenne, nem? 26.05.2011
  • @moteutsch: Nem, mert a array a C-típusú rendszerben array-of-int-pointers típusúnak számít. C-ben kiírva ez int* ()[] típusú lenne. Ha a &array-t választaná, akkor a C-típusú int* (*)[]-t kapná, amely azt mondja, hogy az array egy mutató a int* tömbjére. Ez NEM ugyanaz, mint a int** vagy bármely más mutató-mutató típus. Például, ha 1-es értéket ad hozzá a int* (*)[] típusához, akkor a mutatót a tömb teljes értékével növeli, míg ha a int** értéket 1-gyel növeli, akkor csak a tömb méretét növeli. int mutató. 26.05.2011

  • 4

    E forrás szerint http://unixwiz.net/techtips/reading-cdecl.html , a "menj jobbra, amikor tudsz, menj balra, ha kell" szabályt használva az előző válaszokban adott nyilatkozatok következő 2 jelentését kapjuk -

    int **val ==> val is a pointer to pointer to int
    int* (*pArr)[MAX] ==> pArr is a pointer to an array of MAX length pointers to int.
    

    Remélem, a fenti jelentések értelmesek, és ha nem, akkor valószínűleg jó ötlet lenne áttanulmányozni a fent említett forrást.

    Most már világosnak kell lennie, hogy a második deklaráció az, amelyet a moteutsch keres, mivel egy mutatót deklarál egy mutatótömbre.

    Akkor miért működik az első is? Emlékezz arra

    int* arr[MAX]
    

    egy egész számú mutatók tömbje. Tehát a val egy mutató az int mutatótömbön belül deklarált első int-re.

    25.09.2016

    5

    Szerintem a válasz egyszerű:

    int **val;
    val = arr;
    
    09.10.2016

    6

    Amennyire én tudom, nincs konkrét típusú "egész számok tömbje" a c-ban, így lehetetlen rá konkrét mutató. Az egyetlen dolog, amit tehet, az az, hogy mutatót használ az int-re: int*, de figyelembe kell vennie az int méretét és a tömb hosszát.

    25.05.2011
  • Az int [] egész számok tömbje, és eltér a int * értéktől, de implicit módon int *-ra csökken, ha függvényargumentumként használják, vagy olyan környezetben, ahol mutató aritmetika történik. 26.05.2011
  • A C-nek biztosan vannak tömbtípusai, és ezek nem egyenlőek a mutatótípusokkal, ha erre gondolsz. Próbáld meg lefordítani a int main() { int a[1] = {0}; int i; a = &i; return 0; } 26.05.2011
  • A tömbtípusok és a mutatótípusok közötti legfontosabb különbség az, hogy hogyan reagálnak a sizeof-re. 26.05.2011

  • 7
  • Bár ez a kód megoldhatja a kérdést, egy magyarázattal, hogy ez hogyan és miért oldja meg a problémát, valóban segítene javítani a probléma minőségét. bejegyzést, és valószínűleg több pozitív szavazatot eredményez. Ne feledje, hogy a jövőben az olvasóknak válaszol a kérdésre, nem csak annak, aki most kérdez. Kérjük, szerkessze válaszát, hogy magyarázatokat adjon hozzá, és jelezze, milyen korlátozások és feltételezések vonatkoznak rájuk. A felülvizsgálatból 24.05.2020
  • @double-beep: Van itt legalább valami magyarázat – csak nem olyan nyilvánvaló, mint ahogy soron belüli megjegyzésként kezelik a kódblokkban. Egyetértek azzal, hogy egy gyors bevezetés hasznos lenne itt, és különösen annak fényében, hogy ez egy régi kérdés, amelyre jó néhány válasz van. 25.05.2020
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..