Operátor dereference - Dereference operator
tento článek ne uvést žádný Zdroje.Březen 2007) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
The operátor dereference nebo operátor indirection, někdy označeno „*
"(tj hvězdička ), je unární operátor (tj. jeden s jediným operandem) nalezený v C -jako jazyky, které zahrnují ukazatel proměnné. Funguje na proměnné ukazatele a vrací l-hodnota
ekvivalentní hodnotě na adrese ukazatele. Tomu se říká „dereferencování“ ukazatele. Například kód C.
int X; int *p; // * se používá v deklaraci: // p je ukazatel na celé číslo, protože (po dereferencování), // * p je celé číslo X = 0; // nyní x == 0 p = &X; // & vezme adresu x // nyní * p == 0, protože p == & x a tedy * p == x *p = 1; // ekvivalent x = 1, protože p == & x // nyní * p == 1 a x == 1
přiřadil 1 proměnné X
pomocí operátoru dereference a ukazatele na proměnnou X
.
Složení
Unární * operátor, jak je definován v C a C ++, lze použít v kompozicích v případech vícenásobný směr, kde je zapotřebí více aktů dereferencování. Ukazatele mohou samozřejmě odkazovat na jiné ukazatele a v takových případech je zapotřebí více aplikací operátoru dereference. Obdobně lze operátor Java dot použít v kompozicích tvořících docela sofistikované příkazy, které během vyhodnocení vyžadují podstatné dereferencování ukazatelů v zákulisí.
Základní příklad vícenásobného ukazatele indirection je argv argument k hlavní funkce v C (a C ++), který je uveden v prototypu jako char ** argv
. Název spustitelného spustitelného programu a všechny následující argumenty příkazového řádku jsou uloženy jako nezávislé řetězce znaků. Pole ukazatelů na char
obsahuje ukazatele na první znak každého z těchto řetězců a toto pole ukazatelů je předáno hlavní
fungovat jako argv
argument. Samotné předané pole se „rozpadá“ na ukazatel argv
je ve skutečnosti ukazatel na ukazatel na char
, i když to znamená řadu ukazatelů na char
(podobně, ukazatele v poli, přičemž každý formálně ukazuje na jeden char
, ve skutečnosti ukazují na to, co jsou řetězce znaků). Doprovod hlavní
argument, argc
, poskytuje velikost pole (tj. počet řetězců, na které ukazují prvky pole), protože velikost (nejvzdálenějšího) pole je jinak ztracena, když je předána funkci a převedena na ukazatel. Tím pádem, argv
je ukazatel na 0. prvek pole ukazatelů na char
, * argv
, což je ukazatel na ** argv
, znak (přesně, 0. znak prvního řetězce argumentu, který je podle konvence název programu).
Jiná syntaxe
v BCPL, předchůdce C, byl ekvivalentní operátor zastoupen pomocí vykřičník.
V C je adresa struktury (nebo unie) s
je označen & s
. Adresa provozovatele &
je inverzní operátor dereferencování *
, tak * & s
je ekvivalentní k s
. Adresa struktury (nebo unie) s
lze přiřadit ukazateli p
:
p = &s; // adresa s byla přiřazena p; p == & s; // * p je ekvivalentní s
Hodnota člena A
struktury s
je označen s.a.
. Dostal ukazatel p
na s
(tj. p == & s
), s.a.
je ekvivalentní k (* p) .a
, a také na zkratku p-> a
který je syntaktický cukr pro přístup ke členům struktury (nebo unie) prostřednictvím ukazatele:
p = &s; // adresa s byla přiřazena p; p == & s; // s.a je ekvivalentní (* p) .a // s.a je ekvivalentní p-> a // (* p) .a je ekvivalentní k p-> a
The ->
operátor může být připoután; například v propojeném seznamu lze odkazovat na n-> další-> další
pro druhý následující uzel (za předpokladu, že n-> další
není null).
V Unixu skriptování prostředí a v nástrojích, jako je Makefiles, znak dolaru "$
"je operátor dereference, který se používá k překladu názvu proměnné do jejího obsahu a při přiřazování k proměnné zejména chybí.
V různých jazycích se předpony používají v identifikátorech, známých jako sigily. Nejedná se o unární operátory - syntakticky jsou lexikálně součástí identifikátoru a mají odlišnou sémantiku, jako je například označení datového typu identifikátoru -, ale jsou syntakticky podobné operátoru dereference a lze je s ním zaměnit. Například v shellovém skriptu $ FOO
je operátor dereference $
aplikován na proměnnou FOO
, zatímco v Perlu $ foo
je skalární proměnná volala foo
. V PHP je FOO konstanta (definovaná uživatelem nebo vestavěná), $ FOO je proměnná s názvem FOO a $$ FOO je proměnná, jejíž název je uložen v proměnné s názvem FOO.