Megosztás:


Mutatódeklarációk

A mutatódeklaráció egy mutatóváltozót nevez el, és megadja annak az objektumnak a típusát, amelyre a változó rámutat. A mutatóként deklarált változó memóriacímet tartalmaz.

Szemantika

declarator:
pointer választdirect-declarator

direct-declarator:
identifier
( declarator )
direct-declarator [ constant-expression választ]
direct-declarator ( parameter-type-list )
direct-declarator ( identifier-list választ)

pointer:
* type-qualifier-list választ
* type-qualifier-list választpointer

type-qualifier-list:
type-qualifier
type-qualifier-list type-qualifier

Ez type-specifier adja meg az objektum típusát, amely bármilyen alapszintű, szerkezetű vagy egyesítő típusú lehet. A mutatóváltozók függvényekre, tömbökre és más mutatókra is mutathatnak. (Az összetettebb mutatótípusok deklarálásával és értelmezésével kapcsolatos információkért tekintse meg az Összetettebb deklarátorok értelmezését.)

A beállítással type-specifiervoidkésleltetheti annak a típusnak a meghatározását, amelyre a mutató hivatkozik. Az ilyen elemeket "mutatónak void" nevezzük, és a következőképpen íródik void *: . Mutatóként void deklarált változó bármilyen típusú objektumra mutathat. Ha azonban a legtöbb műveletet az egérmutatón vagy azon az objektumon szeretné végrehajtani, amelyre mutat, az egyes műveletekhez explicit módon meg kell adni azt a típust, amelyre mutat. (A típus char * - és típusváltozók void * hozzárendelés-kompatibilisek típusbeosztás nélkül.) Az ilyen átalakítás típus leadással is elvégezhető. További információ: Type-Cast Konverziók.

Ez type-qualifier lehet vagy constvolatile, vagy mindkettő. Ezek a kulcsszavak azt adják meg, hogy a mutatót maga a program nem módosíthatja (constvagy hogy a mutatót a program (volatile) vezérlésén kívüli folyamat jogszerűen módosíthatja. További információ a típus-minősítőkről const és volatilea típus-minősítőkről.

A declarator változó nevei, és típusmódosítót is tartalmazhatnak. Ha például declarator egy tömböt jelöl, a mutató típusa úgy módosul, hogy egy tömbre mutató mutató legyen.

A struktúra, az egyesítő vagy az enumerálási típus definiálása előtt deklarálhat egy mutatót egy struktúrára, egybeesésre vagy enumerálási típusra. A mutatót a példákban látható struktúra vagy egyesítő címke használatával deklarálhatja. Ezek a deklarációk azért engedélyezettek, mert a fordítónak nem kell ismernie a struktúra vagy az egyesítő méretét a mutatóváltozó helyének lefoglalásához.

Példák

Az alábbi példák a mutatódeklarációkat szemléltetik.

char *message; /* Declares a pointer variable named message */

A message mutató egy típussal rendelkező char változóra mutat.

int *pointers[10];  /* Declares an array of pointers */

A pointers tömb 10 elemből áll; mindegyik elem egy típussal rendelkező int változó mutatója.

int (*pointer)[10]; /* Declares a pointer to an array of 10 elements */

A pointer változó egy 10 elemet tartalmazó tömbre mutat. A tömb minden eleme rendelkezik int típussal.

int const *x;      /* Declares a pointer variable, x,
                      to a constant value */

A mutató x módosítható úgy, hogy egy másik int értékre mutasson, de az az érték, amelyre mutat, nem módosítható.

const int some_object = 5 ;
int other_object = 37;
int *const y = &fixed_object;
int volatile *const z = &some_object;
int *const volatile w = &some_object;

Az ezekben a deklarációkban szereplő változó y állandó mutatóként van deklarálva egy int értékhez. A rá mutató érték módosítható, de magának a mutatónak mindig ugyanarra a helyre kell mutatnia: a címére fixed_object. Hasonlóképpen z , ez egy állandó mutató, de deklarálva van egy olyan értékre int is, amelynek az értékét a program nem tudja módosítani. A volatile kijelölő azt jelzi, hogy bár a program nem tudja módosítani a const int hivatkozott z értékeket, jogszerűen módosítható egy, a programmal egyidejűleg futó folyamat. A deklaráció w azt határozza meg, hogy a program nem tudja módosítani a mutatott értéket, és hogy a program nem tudja módosítani a mutatót.

struct list *next, *previous; /* Uses the tag for list */

Ez a példa két olyan mutatóváltozót deklarál (next és previous) , amelyek a struktúratípusra listmutatnak. Ez a deklaráció a struktúratípus definíciója list előtt jelenhet meg (lásd a következő példát), amennyiben a list típusdefiníció láthatósága megegyezik a deklarációéval.

struct list
{
    char *token;
    int count;
    struct list *next;
} line;

A változó line neve a struktúratípus list. A list struktúratípus három tagból áll: az első tag egy char értékre mutató mutató, a második egy int érték, a harmadik pedig egy másik list struktúrára mutató mutató.

struct id
{
    unsigned int id_no;
    struct name *pname;
} record;

A változó record szerkezettípusa id. pname egy másik, nevesített struktúratípus mutatójaként van deklarálva name. Ez a deklaráció a name típus definiálása előtt is megjelenhet.

Lásd még

Deklarátorok és változódeklarációk