Deklaracje wskaźników
Deklaracja wskaźnika nazywa zmienną wskaźnika i określa typ obiektu, do którego wskazuje zmienna. Zmienna zadeklarowana jako wskaźnik przechowuje adres pamięci.
Składnia
declarator
:
pointer
Zdecydować direct-declarator
direct-declarator
:
identifier
(
declarator
)
direct-declarator
[
constant-expression
Zdecydować ]
direct-declarator
(
parameter-type-list
)
direct-declarator
(
identifier-list
Zdecydować )
pointer
:
*
type-qualifier-list
Zdecydować
*
type-qualifier-list
Zdecydować pointer
type-qualifier-list
:
type-qualifier
type-qualifier-list
type-qualifier
Parametr type-specifier
daje typ obiektu, który może być dowolnym podstawowym, strukturą lub typem unii. Zmienne wskaźnika mogą również wskazywać funkcje, tablice i inne wskaźniki. (Aby uzyskać informacje na temat deklarowania i interpretowania bardziej złożonych typów wskaźników, zapoznaj się z artykułem Interpretowanie bardziej złożonych deklaratorów).
Tworząc element type-specifier
void
, można opóźnić specyfikację typu, do którego odwołuje się wskaźnik. Taki element jest określany jako "wskaźnik do void
" i jest zapisywany jako void *
. Zmienna zadeklarowana jako wskaźnik void
może służyć do wskazywania obiektu dowolnego typu. Jednak aby wykonać większość operacji na wskaźniku lub w obiekcie, do którego wskazuje, typ, do którego wskazuje, musi być jawnie określony dla każdej operacji. (Zmienne typu char *
i typu void *
są zgodne z przypisaniem bez rzutowania typu). Taką konwersję można wykonać za pomocą rzutu typu. Aby uzyskać więcej informacji, zobacz Konwersje rzutów typu.
Może type-qualifier
to być wartość const
lub volatile
, lub oba. Te słowa kluczowe określają odpowiednio, że wskaźnik nie może być modyfikowany przez sam program (const
) lub że wskaźnik może być modyfikowany przez jakiś proces poza kontrolą programu (volatile
). Aby uzyskać więcej informacji na temat const
i volatile
, zobacz Kwalifikatory typów.
Nazwy declarator
zmiennej i mogą zawierać modyfikator typów. Na przykład jeśli declarator
reprezentuje tablicę, typ wskaźnika jest modyfikowany jako wskaźnik do tablicy.
Przed zdefiniowaniem struktury, unii lub typu wyliczenia można zadeklarować wskaźnik do typu struktury, unii lub wyliczenia. Wskaźnik można zadeklarować przy użyciu struktury lub tagu unii, jak pokazano w przykładach. Takie deklaracje są dozwolone, ponieważ kompilator nie musi znać rozmiaru struktury ani unii, aby przydzielić miejsce dla zmiennej wskaźnika.
Przykłady
W poniższych przykładach pokazano deklaracje wskaźników.
char *message; /* Declares a pointer variable named message */
Wskaźnik message
wskazuje zmienną o char
typie.
int *pointers[10]; /* Declares an array of pointers */
Tablica pointers
zawiera 10 elementów; każdy element jest wskaźnikiem do zmiennej o int
typie.
int (*pointer)[10]; /* Declares a pointer to an array of 10 elements */
Zmienna pointer
wskazuje tablicę z 10 elementami. Każdy element w tej tablicy ma int
typ.
int const *x; /* Declares a pointer variable, x,
to a constant value */
Wskaźnik x
można zmodyfikować tak, aby wskazywał inną int
wartość, ale wartość, do której wskazuje, nie można jej modyfikować.
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;
Zmienna w tych deklaracjach jest zadeklarowana jako stały y
wskaźnik do int
wartości. Wartość, która wskazuje, można zmodyfikować, ale sam wskaźnik musi zawsze wskazywać tę samą lokalizację: adres fixed_object
. Podobnie, z
jest stałym wskaźnikiem, ale jest również zadeklarowany, aby wskazać int
, której wartości nie można modyfikować przez program. Specyfikator volatile
wskazuje, że chociaż wartość const int
wskazywana przez z
program nie może być modyfikowana przez program, może ona zostać zmodyfikowana przez proces uruchomiony współbieżnie z programem. Deklaracja w
określa, że program nie może zmienić wartości wskazywanej i że program nie może zmodyfikować wskaźnika.
struct list *next, *previous; /* Uses the tag for list */
W tym przykładzie zadeklarowane są dwie zmienne wskaźnika (next
i previous
), które wskazują typ list
struktury . Ta deklaracja może pojawić się przed definicją list
typu struktury (zobacz następny przykład), o ile list
definicja typu ma taką samą widoczność jak deklaracja.
struct list
{
char *token;
int count;
struct list *next;
} line;
Zmienna line
ma typ struktury o nazwie list
. list
Typ struktury ma trzy elementy członkowskie: pierwszy element członkowski jest wskaźnikiem char
do wartości, drugi jest wartościąint
, a trzeci jest wskaźnikiem do innej list
struktury.
struct id
{
unsigned int id_no;
struct name *pname;
} record;
Zmienna record
ma typ id
struktury . pname
jest deklarowany jako wskaźnik do innego typu struktury o nazwie name
. Ta deklaracja może pojawić się przed zdefiniowaną typem name
.