SORU
11 EYLÜL 2008, PERŞEMBE


Ne bir işaretçi değişkeni ve C bir referans değişkeni arasındaki farklar ?

Başvurular sözdizimsel şeker olduğunu biliyorum, kodu okumak ve yazmak daha kolay.

Ama farklar nelerdir?


Cevaplar ve linkler Özet aşağıda:

  1. Bir işaretçi başvuru yeniden oturmuş bağlama sonra değil, yeniden atanmış kez herhangi bir sayı olabilir.
  2. Göstericiler hiçbir yerde işaret edebilir (NULL), başvuru her zaman bir nesneye bakın oysa.
  3. İşaretçileri gibi bir referans adresi alamazsın.
  4. "Başvuru aritmetik" (ama bir nesne başvurusu tarafından işaret edilen Adres alıp &obj 5 - işaretçi aritmetiği yapabilirsiniz). hayır yok

Bir yanlış anlama netleştirmek için:

C standart bir derleyici gerekir nasıl dikte önlemek için çok dikkatli. uygulamak başvuruları, ama derleyici uygulayan her C işaretçiler olarak başvuruyor. Yani, böyle bir itiraz olarak:

int &ri = i;

eğer tamamen optimize değilse,depolama aynı miktarda ayırır bir işaretçi olarak, ve adres yerler ben o depoya.

Yani, bir işaretçi ve referans bellek aynı miktarda işgal.

Genel bir kural olarak,

  • İşlev parametreleri ve dönüş türleri başvurular yararlı ve belgeleyen self-arayüzleri tanımlamak için kullanın.
  • Göstericiler algoritmalar ve veri yapıları uygulamak için kullanın.

İlginç okuyun:

CEVAP
11 EYLÜL 2008, PERŞEMBE


  1. Bir işaretçi yeniden atanabilir:

    int x = 5;
    int y = 6;
    int *p;
    p =  &x;
    p = &y;
    *p = 10;
    assert(x == 5);
    assert(y == 10);
    

    Bir referans olamaz, ve başlatma sırasında verilmelidir:

    int x = 5;
    int y = 6;
    int &r = x;
    
  2. Bir işaretçi kendi bellek adresi ve boyutu yığın (4 bayt 86), oysa bir referans hisse aynı bellek adresi (orijinal değişken) değil, aynı zamanda kaplıyor biraz boşluk yığını. Başvuru orijinal değişkeni aynı Adres olduğundan, güvenli aynı değişken için başka bir isim olarak bir referans. Not: bir işaretçi işaret Ne yığın veya yığın olabilir. Başvuru Ditto. Bu ifade ediyorlar işaretçi yığını göstermelidir. Bir işaretçi bellek adresi tutan bir değişkendir. Bu değişken yığında. Beri bir referans yığında kendi alanı vardır, ve adres beri değişkeni olarak aynı başvurular. Daha fazla stack vs heap. Bu derleyici size söylemeyeceğim bir referans gerçek bir adres olduğunu ima eder.

    int x = 0;
    int &r = x;
    int *p = &x;
    int *p2 = &r;
    assert(p == p2);
    
  3. İşaretçiler ek yönlendirme düzeyde sunan işaretçiler işaretçiler var. Başvurular ise sadece yönlendirme düzeyi sunuyoruz.

    int x = 0;
    int y = 0;
    int *p = &x;
    int *q = &y;
    int **pp = &p;
    pp = &q;//*pp = q
    **pp = 4;
    assert(y == 4);
    assert(x == 0);
    
  4. İşaretçi doğrudan başvuru yapamaz ise NULL atanabilir. Eğer yeterince çalışırsanız, bir referans NULL adresi nasıl yapabilirsiniz biliyor. Eğer yeterince çalışırsanız aynı şekilde, bir işaretçi için bir referans olabilir, ve daha sonra bu referans NULL içerebilir.

    int *p = NULL;
    int &r = NULL; <--- compiling error
    
  5. İşaretçiler bir dizi üzerinde yineleme, bir işaretçi işaret ettiğini sonraki öğeye gitmek için kullanabilirsiniz, ve 4 5 eleman kaldı. Bu nesne, işaretçi işaret eden ne olursa olsun.

  6. Bir işaretçi başvuru doğrudan kullanılabilir iken * ile konuma işaret belleğine erişmek için başvuru yapıldı, olması gerekir. Sınıf/bir yapı için bir işaretçi başvuru . kullanır, ancak -> üyeleri erişmek için kullanır.

  7. Bir işaretçi bellek adresi tutan değişkendir. Başvuru nasıl uygulanır ne olursa olsun, bir referans başvurduğu öğe olarak aynı bellek adresi vardır.

  8. Olamaz başvurular işaretçiler olabilir, oysa bir diziye, (kullanıcı @litb tarafından Belirtilen) doldurulmuş

  9. İnş başvurular geçici bağlanabilir. Göstericiler olamaz (bazı Yönlendirme Olmadan):

    const int &x = int(12); //legal C  
    int *y = &int(12); //illegal to dereference a temporary.
    

    Bu const& daha güvenli argüman listeleri kullanmak için ve benzeri yapar.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AverageBroTV

    AverageBroTV

    20 Mart 2013
  • failblog

    failblog

    17 HAZİRAN 2008
  • TWiT Netcast Network

    TWiT Netcast

    27 EKİM 2005