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
:
pointer
volit direct-declarator
direct-declarator
:
identifier
(
declarator
)
direct-declarator
[
constant-expression
volit ]
direct-declarator
(
parameter-type-list
)
direct-declarator
(
identifier-list
volit )
pointer
:
*
type-qualifier-list
volit
*
type-qualifier-list
volit 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
void
typu, 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 volatile
nebo 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 volatile
naleznete 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 list
struktury . 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 id
struktury . 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.