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;
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;
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.
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.
Az IIRC, a tömbök implicit módon pointerekké konvertálhatók, így a következő lenne:
int ** val = arr;
arr
valójában array-of-pointers-to-int` típusú, nem pedig pointer-to-int. 26.05.2011 int** arr
? Tehát &arr
int ***
lenne, nem? 26.05.2011 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 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.
Szerintem a válasz egyszerű:
int **val;
val = arr;
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.
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 int main() { int a[1] = {0}; int i; a = &i; return 0; }
26.05.2011 sizeof
-re. 26.05.2011
val
egy mutató aint
mutatók tömbjére (szemantikai értelemben) ... ha aval
hivatkozást megszüntette, akkor ismét a mutatótömböt kapja, azaz megteheti a(*val)[INDEX]
tömböt. Tehát mivel azval
a címet egyint*
tömb elejéhez tartja, akkor ez egy mutató egy mutatótömbre. 26.05.2011val
nem egy mutató tömbjének mutatója. Aval
egy mutató a tömb első mutatójára.(*val)[INDEX]
nem egyenértékű aarray[INDEX]
-vel. Ehelyett azval[INDEX]
aarray[INDEX]
-nak felel meg. Aval
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