Sdílet prostřednictvím


Operátory dereference a adresa

Unární nepřímý operátor (*) přistupuje k hodnotě nepřímo prostřednictvím ukazatele. Operand musí být typ ukazatele. Výsledkem operace je hodnota adresovaná operandem, tedy hodnota na adrese, na kterou operand ukazuje. Typ výsledku je typ adresovaný operandem.

Výsledek operátoru indirection je typ , pokud je operand typu ukazatel na typ. Ukazuje-li operand na funkci, je výsledkem označení funkce. Pokud odkazuje na objekt, výsledek je lvalue, který určuje objekt.

Pokud hodnota ukazatele není platná, je výsledek operátoru nepřímých výrazů nedefinovaný. Tady jsou některé z nejběžnějších podmínek, které zneplatní hodnotu ukazatele:

  • Ukazatel je nulový.

  • Ukazatel určuje adresu objektu po konci jeho životnosti v době odkazu. (Například objekt, který je mimo rozsah nebo je uvolněn.)

  • Ukazatel určuje adresu, která je nevhodně zarovnaná pro typ objektu, na který odkazuje.

  • Ukazatel určuje adresu, která není používána spuštěným programem.

Unární operátor (&) poskytuje adresu svého operandu. Operand musí být jednou z těchto věcí:

  • Hodnota lvalue označující objekt, který není deklarován register a není bitovým polem.

  • Výsledek unárního dereference (*) nebo operátoru dereference pole ([]).

  • Návrh funkce.

Výsledkem je ukazatel typu operand_type pro operand typu operand_type.

Pokud je operand výsledkem unárního * operátoru, nevyhodnotí se ani jeden operátor a výsledek bude stejný, jako kdyby byly oba vynechány. Výsledek není lvalue a omezení operátorů stále platí. Pokud je operand výsledkem [] operátoru, & operátor a unární implicitní * operátor [] se nevyhodnocují. Výsledek má stejný účinek jako odebrání operátoru & a změna [] operátoru + na operátor. V opačném případě je výsledkem ukazatel na objekt nebo funkci určenou operandem.

Příklady

Následující příklady používají tyto běžné deklarace:

int *pa, x;
int a[20];

Tento příkaz používá adresu operátoru (&) k převzetí adresy šestého prvku pole a. Výsledek je uložen v proměnné paukazatele:

pa = &a[5];

Operátor indirection (*) se v tomto příkladu int používá pro přístup k hodnotě na adrese uložené v pa. Hodnota je přiřazena k celočíselné proměnné x:

x = *pa;

Tento příklad ukazuje, že výsledek použití operátoru indirection na adresu x je stejný jako x:

assert( x == *&x );

Tento příklad ukazuje ekvivalentní způsoby deklarování ukazatele na funkci:

int roundup( void );     /* Function declaration */

int  *proundup  = roundup;
int  *pround  = &roundup;
assert( pround == proundup );

Po deklaraci funkce roundup jsou na tuto funkci roundup deklarovány a inicializovány dva ukazatele. První ukazatel proundup je inicializován pouze pomocí názvu funkce, zatímco druhý ukazatel pround v inicializaci používá operátor adresa. Tyto inicializace jsou ekvivalentní.

Viz také

Operátor indirection: *
Operátor adresy: &