Deferenční operátory a operátory adresy
Operátor dereference (*) nepřímo přistupuje k hodnotě prostřednictvím ukazatele.Operandem musí být hodnota ukazatele.Výsledkem operace je hodnota adresovaná operandem, tedy hodnota na adrese, na kterou operand ukazuje.Typ výsledku je typ adresovaný operandem.
Ukazuje-li operand na funkci, je výsledkem označení funkce.Ukazuje-li na umístění úložiště, je výsledkem l-hodnota označující umístění úložiště.
Pokud je hodnota ukazatele neplatná, výsledek je nedefinován.Následující seznam zahrnuje některé z nejběžnějších situací, které zneplatňují hodnotu ukazatele.
Ukazatel je nulový.
Ukazatel určuje adresu místní položky, která v době reference není viditelná.
Ukazatel určuje adresu, která je pro typ objektu, na který ukazatel ukazuje, nesprávně zarovnána.
Ukazatel určuje adresu, která není používána spuštěným programem.
Operátor adresa (&) poskytuje adresu svého operandu.Operand operátoru adresa může být označením funkce nebo l-hodnotou označující objekt, který se nachází mimo bitové pole a který není deklarován specifikátorem třídy úložiště register.
Výsledkem operace adresa je ukazatel na operand.Typ adresovaný ukazatelem je typ operandu.
Operátor adresa lze použít pouze pro proměnné základních typů, struktur nebo sjednocení deklarovaných na úrovni oboru souboru nebo na indexované reference polí.V těchto výrazech lze konstantní výraz, který neobsahuje operátor adresa, přičíst nebo odečíst od výrazu adresy.
Příklady
Následující příklady používají tyto deklarace:
int *pa, x;
int a[20];
double d;
Tento příkaz používá operátor adresa:
pa = &a[5];
Operátor adresa (&) přebírá adresu šestého prvku v poli a.Výsledek je uložen v proměnné ukazatele pa.
x = *pa;
Operátor dereference (*) je v tomto příkladu použit pro přístup k hodnotě int na adrese uložené v proměnné pa.Hodnota přiřazená k celočíselné proměnné x.
if( x == *&x )
printf( "True\n" );
Tento příklad vytiskne slovo True jako ukázku, že výsledek použití operátoru dereference na adresu proměnné x je shodný s výrazem x.
int roundup( void ); /* Function declaration */
int *proundup = roundup;
int *pround = &roundup;
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í.