Sdílet prostřednictvím


Deklarace ukazatelů

Deklarace ukazatele pojmenuje proměnnou ukazatele a určuje typ objektu, na který proměnná odkazuje. Proměnná deklarovaná jako ukazatel obsahuje adresu paměti.

Syntaxe

declarator:
pointervolit direct-declarator

direct-declarator:
identifier
( declarator )
direct-declarator[ constant-expressionvolit ]
direct-declarator ( parameter-type-list )
direct-declarator( identifier-listvolit )

pointer:
*type-qualifier-listvolit
*type-qualifier-listvolit pointer

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

Poskytuje type-specifier typ objektu, který může být jakýkoli základní, strukturní nebo sjednocovacího typu. Proměnné ukazatele můžou také odkazovat na funkce, pole a další ukazatele. (Informace o deklarování a interpretaci složitějších typů ukazatelů najdete v tématu Interpretace složitějších deklarátorů.)

Provedením specifikace type-specifier voidtypu, na který ukazatel odkazuje, můžete zpozdit. Taková položka je označována jako "ukazatel na void" a je zapsána jako void *. Proměnná deklarovaná jako ukazatel lze void použít k odkazování na objekt libovolného typu. Chcete-li však provádět většinu operací s ukazatelem nebo objektem, na který odkazuje, musí být pro každou operaci explicitně zadán typ, na který body odkazuje. (Proměnné typu char * a typu void * jsou kompatibilní s přiřazením bez přetypování typu.) Takový převod lze provést pomocí přetypování typu. Další informace naleznete v tématu Převody typu přetypování.

Může type-qualifier to být buď const nebo volatilenebo obojí. Tato klíčová slova určují, v uvedeném pořadí, že ukazatel nemůže být upraven samotným programem (const), nebo že ukazatel může být oprávněným způsobem upraven některým procesem, který přesahuje kontrolu nad programem (volatile). Další informace o const kvalifikátorech typu a volatilenaleznete v tématu kvalifikátory typu.

Názvy declarator proměnné a mohou obsahovat modifikátor typu. Pokud declarator například představuje pole, změní se typ ukazatele tak, aby byl ukazatelem na pole.

Před definováním struktury, sjednocení nebo výčtu můžete deklarovat ukazatel na typ struktury, sjednocení nebo výčtu. Ukazatel deklarujete pomocí struktury nebo sjednocení značky, jak je znázorněno v příkladech. Tyto deklarace jsou povoleny, protože kompilátor nepotřebuje znát velikost struktury nebo sjednocení pro přidělení prostoru pro proměnnou ukazatele.

Příklady

Následující příklady znázorňují deklarace ukazatelů.

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

Ukazatel message odkazuje na proměnnou s typem char .

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

Pole pointers má 10 prvků; každý prvek je ukazatel na proměnnou s typem int .

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

Proměnná pointer odkazuje na pole s 10 prvky. Každý prvek v tomto poli má int typ.

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

Ukazatel x lze upravit tak, aby ukazoval na jinou int hodnotu, ale hodnotu, na kterou odkazuje, nelze upravit.

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;

Proměnná y v těchto deklarací je deklarována jako konstantní ukazatel na int hodnotu. Hodnota, na kterou odkazuje, může být změněna, ale samotný ukazatel musí vždy odkazovat na stejné umístění: adresu fixed_object. Podobně je to konstantní ukazatel, ale je také deklarován tak, z aby odkazoval na int hodnotu, jejíž hodnotu program nemůže upravit. Specifikátor volatile označuje, že i když hodnota const int odkazované uživatelem z nemůže být programem upravena, mohl by být upraven procesem spuštěným souběžně s programem. w Deklarace určuje, že program nemůže změnit hodnotu, na kterou odkazuje, a že program nemůže změnit ukazatel.

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

Tento příklad deklaruje dvě proměnné ukazatele (next a previous) odkazují na typ liststruktury . Tato deklarace se může zobrazit před definicí list typu struktury (viz další příklad), pokud list má definice typu stejnou viditelnost jako deklarace.

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

Proměnná line má typ struktury s názvem list. Typ list struktury má tři členy: první člen je ukazatel na char hodnotu, druhý je int hodnota a třetí je ukazatel na jinou list strukturu.

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

Proměnná record má typ idstruktury . pname je deklarován jako ukazatel na jiný typ struktury s názvem name. Tato deklarace se může zobrazit před definováním name typu.

Viz také

Deklarátor a deklarace proměnné