Operatory pośrednie i „Address-of”
Operator pośredni (*) uzyskuje dostęp do wartości pośrednio za pomocą wskaźnika.Argumentem operacji musi być wartość wskaźnika.Wynik operacji jest wartością adresowaną przez argument operacji; oznacza to wartość pod adresem, na który wskazuje argument operacji.Typ wyniku jest typem adresowanym przez argument operacji.
Jeśli argument operacji wskazuje funkcję, wynikiem jest opis funkcji.Jeśli wskazuje on lokalizację pamięci, wynikiem jest l-wartość opisująca lokalizację pamięci.
Jeśli wartość wskaźnika jest nieprawidłowa, wynik jest nieokreślony.Następująca lista zawiera niektóre z najbardziej typowych warunków, które unieważniają wartość wskaźnika.
Wskaźnik jest pustym wskaźnikiem.
Wskaźnik określa adres lokalnego elementu, który nie jest widoczny w czasie odwołania.
Wskaźnik określa adres, który jest nieodpowiednio wyrównany dla typu wskazywanego obiektu.
Wskaźnik określa adres nieużywany przez wykonujący program.
Operator adresu (&) podaje adres jego argumentu operacji.Argument operacji operatora adresu może być określeniem funkcji lub l-wartością, która określa obiekt nie będący polem bitowym i nie jest zadeklarowany z użyciem specyfikatora klasy magazynowej register.
Wynik operacji adresu jest wskaźnikiem do argumentu operacji.Typ adresowany przez wskaźnik jest typem argumentu operacji.
Operator adresu można stosować tylko do zmiennych o typie podstawowym, do struktury, lub typów związków, które zostały zadeklarowane na poziomie pliku lub do indeksowanych odwołań do tablic.W tych wyrażeniach wyrażenie stałe, które nie zawiera operatora adresu może być dodane lub odjęte od wyrażenia adresu.
Przykłady
W poniższych przykładach użyto tych deklaracji:
int *pa, x;
int a[20];
double d;
Ta instrukcja używa operatora adresu:
pa = &a[5];
Operator adresu (&) przyjmuje adres szóstego elementu tablicy a.Wynik jest przechowywany w zmiennej wskaźnika pa.
x = *pa;
Operator pośredni (*) jest używany w tym przykładzie w celu uzyskania dostępu do wartości int pod adresem przechowywanym w pa.Wartość jest przypisywana do zmiennej całkowitej x.
if( x == *&x )
printf( "True\n" );
W tym przykładzie drukowany jest wyraz True, ilustrując, że wynik zastosowania operatora pośredniego do adresu x jest taki sam, co x.
int roundup( void ); /* Function declaration */
int *proundup = roundup;
int *pround = &roundup;
Gdy deklarowana jest funkcja roundup, deklarowane i inicjowane są dwa wskaźniki do roundup.Pierwszy wskaźnik proundup jest inicjowany jedynie za pomocą nazwy funkcji, podczas gdy drugi pround używa operatora adresu przy inicjacji.Inicjacje są równoważne.