Operatory pośrednie i „address-of”
Operator jednoargumentowy (*
) uzyskuje dostęp do wartości pośrednio za pośrednictwem wskaźnika. Operand musi być typem wskaźnika. Wynik operacji jest wartością adresowaną przez operand; czyli wartość pod adresem, na który wskazuje operand. Typ wyniku jest typem adresowanym przez operand.
Wynik operatora pośredniego jest typem , jeśli operand jest wskaźnikiem typu do typu. Jeśli operand wskazuje funkcję, wynik jest oznaczeniem funkcji. Jeśli wskazuje obiekt, wynik jest wartością lvalue, która wyznacza obiekt.
Jeśli wartość wskaźnika jest nieprawidłowa, wynik operatora pośredniego jest niezdefiniowany. Poniżej przedstawiono niektóre z najczęstszych warunków, które unieważniają wartość wskaźnika:
Wskaźnik jest pustym wskaźnikiem.
Wskaźnik określa adres obiektu po zakończeniu jego okresu istnienia w momencie odwołania. (Na przykład obiekt, który zniknął z zakresu lub został cofnięty).
Wskaźnik określa adres, który jest niewłaściwie wyrównany dla typu wskazywanego obiektu.
Wskaźnik określa adres nieużywany przez program wykonujący.
Jednoargumentowy operator (&
) podaje adres operandu. Operand musi być jedną z następujących rzeczy:
Wartość l, która wyznacza obiekt, który nie jest zadeklarowany
register
i nie jest polem bitowym.Wynik jednoargumentowego operatora dereference (
*
) lub dereference tablicy ([]
).Projektant funkcji.
Wynikiem jest wskaźnik typu operand_type dla operandu typu operand_type.
Jeśli operand jest wynikiem operatora jednoargumentowego *
, żaden operator nie jest oceniany, a wynik jest taki, jakby oba zostały pominięte. Wynik nie jest wartością lvalue, a ograniczenia dotyczące operatorów nadal mają zastosowanie. Jeśli operand jest wynikiem []
operatora, &
operator i jednoargumentowy *
implikowany przez []
operatora nie są oceniane. Wynik ma taki sam efekt jak usunięcie &
operatora i zmiana []
operatora na +
operator. W przeciwnym razie wynik jest wskaźnikiem do obiektu lub funkcji wyznaczonej przez operand.
Przykłady
W poniższych przykładach są używane te typowe deklaracje:
int *pa, x;
int a[20];
Ta instrukcja używa operatora address-of (&
), aby pobrać adres szóstego elementu tablicy a
. Wynik jest przechowywany w zmiennej pa
wskaźnika :
pa = &a[5];
Operator pośredni (*
) jest używany w tym przykładzie do uzyskiwania int
dostępu do wartości pod adresem przechowywanym w pa
pliku . Wartość jest przypisywana do zmiennej całkowitej x
:
x = *pa;
W tym przykładzie pokazano, że wynik zastosowania operatora pośredniego do adresu x
elementu jest taki sam jak x
:
assert( x == *&x );
W tym przykładzie przedstawiono równoważne sposoby deklarowania wskaźnika do funkcji:
int roundup( void ); /* Function declaration */
int *proundup = roundup;
int *pround = &roundup;
assert( pround == proundup );
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 address-of przy inicjalizacji. Inicjalizacje są równoważne.