Referans operatörü - Dereference operator

KQUEUE operatörü ya da doğru olmayan operatör bazen "ile belirtilen, *" (yani, bir yıldız işareti ), a, tekli operatör bulundu (tek bir işlenen yani bir) C dahil dil benzeri işaretçi değişkenler. Bir işaretçi değişkeni üzerinde çalışır l-valueve işaretçi adresindeki değere eşdeğer bir değer döndürür . Buna işaretçinin "referansını kaldırma" denir. Örneğin, C kodu

 int x;
 int *p;  // * is used in the declaration:
          // p is a pointer to an integer, since (after dereferencing),
          // *p is an integer
 x = 0;
 // now x == 0
 p = &x;  // & takes the address of x
 // now *p == 0, since p == &x and therefore *p == x
 *p = 1;  // equivalent to x = 1, since p == &x
 // now *p == 1 and x == 1

xreferans operatörünü ve değişkene bir işaretçiyi kullanarak değişkene 1 atanır x.

Kompozisyon

C ve C++ ' da tanımlandığı şekliyle unary * operatörü, birden çok başvuru kaldırma eyleminin gerekli olduğu çoklu yönlendirme durumlarında bileşimlerde kullanılabilir . İşaretçiler elbette diğer işaretçilere başvurabilir ve bu gibi durumlarda referans operatörünün birden fazla uygulaması gerekir. Benzer şekilde, Java nokta operatörü, değerlendirme sırasında sahne arkasındaki işaretçilerin önemli ölçüde referanslarının kaldırılmasını gerektiren oldukça karmaşık ifadeler oluşturan kompozisyonlarda kullanılabilir.

Çoklu işaretçi dolaylı yönlendirmenin temel bir örneği , prototipte şu şekilde verilen C (ve C++) ana işlevine yönelik argv argümanıdır . Çağrılan program yürütülebilir dosyasının adı ve ardından gelen tüm komut satırı bağımsız değişkenleri bağımsız karakter dizileri olarak saklanır. İşaretçiler bir dizi bu dizeleri her birinin ilk karakterine işaretçiler içerir ve işaretçiler bu dizi geçirilir olarak işleve argüman. Geçirilen dizinin kendisi bir işaretçiye "çürür", bu nedenle aslında bir işaretçi dizisine karşılık gelse de , aslında bir işaretçiye işaretçidir (benzer şekilde, dizideki işaretçiler, her biri resmen tek bir , aslında işaret eder) karakter dizileri nelerdir). Ekteki argüman, dizinin boyutunu (yani, dizinin öğeleri tarafından işaret edilen dizelerin sayısını) sağlar, çünkü (en dıştaki) bir dizinin boyutu, aksi takdirde bir işleve geçirildiğinde ve bir diziye dönüştürüldüğünde kaybolur. Işaretçi. Bu nedenle, işaretçiler bir dizinin 0. elemanı için bir gösterici , sırayla bir işaretçi olan , bir karakter (açık bir şekilde, teamül programın adı birinci dizgenin, 0'ıncı yapı). char **argvcharmainargvargvcharcharcharmainargcargvchar*argv**argv

Diğer sözdizimi

Gelen BCPL , C atasına eşdeğer operatör kullanılarak temsil edilmiştir ünlem .

C'de bir yapının (veya birliğin) adresi sile gösterilir &s. Operatörün adresi &, referanstan çıkarma operatörünün tersidir *, yani *&seşdeğerdir s. Bir yapının (veya birliğin) adresi sbir işaretçiye atanabilir p:

 p = &s; // the address of s has been assigned to p; p == &s;
 // *p is equivalent to s

aBir yapının bir üyesinin değeri sile gösterilir s.a. Bir işaretçi verilen piçin s(örneğin p == &s), s.aiçin eşdeğer olan (*p).a, ve aynı zamanda kestirme için p->aolan sözdizimsel şeker için üye erişen bir işaretçi bir yapı (veya Birliği):

 p = &s; // the address of s has been assigned to p; p == &s;
 // s.a is equivalent to (*p).a
 // s.a is equivalent to p->a
 // (*p).a is equivalent to p->a

->Operatör zincirli olabilir; örneğin, bağlantılı bir listede, n->next->nexttakip eden ikinci düğüm için başvurulabilir ( n->nextbunun boş olmadığı varsayılarak ).

Unix kabuk komut dosyasında ve Makefiles gibi yardımcı programlarda , dolar işareti " $", bir değişkenin adını içeriğine çevirmek için kullanılan referans operatörüdür ve bir değişkene atanırken özellikle yoktur.

Gelen Pascal , KQUEUE operatör ^ hem de çalışmaları, bir işaretçi tanımlamak ve KQUEUE. Aşağıdaki örneğin gösterdiği gibi:

Type
    ComplexP = ^TComplex;     (* ComplexP is a pointer type *)
    TComplex = record         (* TComplex is a record type *) 
       Re,
       Im: Integer;
VAR
    Complex1,                  (* define two pointers *)     
    Complex2: ComplexP;
    Complex : TComplex;         (* define a record *)

begin
     Complex.Re := 3.14159267;    
     Complex.Im := 1.5;           
     New(Complex1);               
     Complex1^.Re := Complex.Re;  
     Complex1^.Im := 3.5;         
     New(Complex2);               
     Complex2^ := Complex;        
END.

Yukarıdaki örnekte

  • 2. satırda, başvuru operatörü ^ , ComplexP işaretçi türünü tanımlamak için kullanılır .
  • 12 ve 13. satırlarda , Complex kaydının Re ve Im alanlarına değerler atanıyor .
  • 14. satırda, Complex1 ( Yeni , Pascal'ın C'nin malloc() işlevinin eşdeğeridir) tarafından işaret edilen bir TComplex kaydı için alan ayrılır .
  • Hat 15 günü, KQUEUE operatörü ^ değerini kopyalamak için kullanılır Yeniden kayıt alanında Kompleksi için Re alanında TComplex tarafından işaret kayıt Complex1 .
  • 16. satırda, başvuru operatörü ^ , Complex1 tarafından gösterilen TComplex kaydının Im alanına bir değer atamak için kullanılır .
  • 17. satırdaki, uzay bir tahsis edilir TComplex tarafından işaret kayıt Complex2 .
  • Hat 18 günü, tüm Kompleksi rekor kopyalanır TComplex tarafından işaret kayıt Complex2 .

Çeşitli dillerde, sigils olarak bilinen tanımlayıcılarda önekler kullanılır . Bunlar tekli operatörler değildir – sözdizimsel olarak tanımlayıcının sözlüksel bir parçasıdırlar ve tanımlayıcının veri türünü belirtmek gibi farklı anlambilimleri vardır – ancak sözdizimsel olarak referans çıkarma operatörüne benzerler ve onunla karıştırılabilirler. Örneğin, bir kabuk betiğinde değişkene uygulanan $FOOreferans operatörü , Perl'de ise skaler bir değişken olarak adlandırılır . PHP'de FOO bir sabittir (kullanıcı tanımlı veya yerleşik), $FOO, FOO adlı bir değişkendir ve $$FOO, adı FOO adlı değişkende saklanan bir değişkendir. $FOO$foofoo

Ayrıca bakınız