Udostępnij za pośrednictwem


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:
pointerZdecydować direct-declarator

direct-declarator:
identifier
( declarator )
direct-declarator[ constant-expressionZdecydować ]
direct-declarator ( parameter-type-list )
direct-declarator( identifier-listZdecydować )

pointer:
*type-qualifier-listZdecydować
*type-qualifier-listZdecydować 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 liststruktury . 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 idstruktury . pname jest deklarowany jako wskaźnik do innego typu struktury o nazwie name. Ta deklaracja może pojawić się przed zdefiniowaną typem name .

Zobacz też

Deklaratory i deklaracje zmiennych