SORU
18 AĞUSTOS 2009, Salı


Arasındaki fark NULL, '\0' ve 0 nedir

C sıfırdan farklı değerler -- NULL, NUL 0 arasında farklılıklar olduğu görülüyor.

ASCII karakter '0' 48 0x30 sonucunu biliyorum.

NULL işaretçi genellikle olarak tanımlanır:

#define NULL 0

Ya

#define NULL (void *)0

Buna ek olarak, NUL karakter 0 olarak değerlendirmek gibi görünüyor '\0'.

Bu üç değerleri eşit olamaz zamanlar vardır?

Bu da 64 bit sistemlerde doğru mu?

CEVAP
18 AĞUSTOS 2009, Salı


Null İşaretçiler

Bu tamsayı sabit, değişmez 0 farklı anlamları olan kullanılan bağlamda bağlı olarak vardır. Her durumda, hala bir tam sayı 0, sadece farklı şekillerde açıklanmıştır değeri ile sabittir.

Eğer bir işaretçi sabit hazır bilgi ile kıyaslanıyor ise 0 bu işaretçi null gösterici olup olmadığını görmek için kontrol edin. 0 bu kadar boş bir işaretçi sonra adlandırılır. C standardı 0 void * bir boş gösterici ve boş bir işaretçi her iki türü için döküm tanımlar.

Ayrıca, okunabilirlik yardımcı olmak, NULL başlığında sağlanan makro stddef.h dosya. Derleyici buna bağlı olarak 30 ** ve saçma bir şey için yeniden tanımlamak mümkün olabilir. Herkes bunu vurulmayı hak ediyor.

Bu nedenle, burada boş bir işaretçi kontrol etmek için geçerli bazı yollar vardır:

if (pointer == NULL)

NULL boş gösterici eşit karşılaştırmak için tanımlanır. Uygulama NULL gerçek tanımı nedir, geçerli bir null işaretçi olarak tanımlanır.

if (pointer == 0)

0 null işaretçi başka bir gösterimidir.

if (!pointer)

if ifadesi olarak bu kontrolleri "0 olmadığı anlamına biz ters", "0".

Aşağıdaki boş gösterici denetlemek için GEÇERSİZ bir yolu vardır:

int mynull = 0;
<some code>
if (pointer == mynull)

Derleyici bu bir null işaretçi için bir kontrol değil, ama bir eşitlik iki değişken kontrol edin. Buolabiliriş eğer mynull hiç değişmiyor Kodu ve derleyici iyileştirmeleri sürekli kat 0 içine if, ama bu garantili ve derleyici üretmek için en az bir tanı mesaj (uyarı ya da hata) göre C Standart.

Ne C dilinde bir boş gösterici olduğunu unutmayın. Temel mimari önemi yok. Eğer altta yatan mimari null işaretçi değeri Adres 0xDEADBEEF, olarak tanımlanan derleyici bu karmaşadan kurtulmak için.

Hatta bu komik mimari olarak, aşağıdaki yollardan hala boş bir işaretçi kontrol etmek için geçerli bir yol

if (!pointer)
if (pointer == NULL)
if (pointer == 0)

Aşağıdaki boş gösterici denetlemek için GEÇERSİZ bir yolu vardır:

#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)

bu normal karşılaştırmalar gibi bir derleyici tarafından görülür.

Boş Karakterler

'\0' null karakteri - tüm bitleri sıfır bir karakter olarak tanımlanır. Bu işaretçiler ile bir ilgisi yok. Ancak bu koda benzer bir şey görebilirsiniz:

if (!*string_pointer)

dize işaretçisi olmadığını denetler boş bir karakter gösteriyor

if (*string_pointer)

dize işaretçisi olmadığını denetler boş olmayan bir karakter gösteriyor

Null işaretçiler ile bu karışık alamadım. Bit gösterimi aynı, ve bu davalarla ilgili bazı kullanışlı çapraz sağlar diye, aynı şey değildir.

Ayrıca, '\0' (tüm karakter rakamları gibi) bir tamsayı sabiti değeri ile bu durumda sıfır. '\0' 0 süssüz bir tamsayı sabit için tamamen eşdeğerdir yani tek fark buniyetinsan bir okuyucu nakleden ("boş bir karakter olarak kullanıyorum")..

Referanslar

Daha fazlası için Question 5.3 of the comp.lang.c FAQ bkz. C standardı için this pdf bkz. Bölüm 6.3.2.3 Göstericiler, paragraf 3'e bak.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • celebrateubuntu

    celebrateubu

    23 Mayıs 2011
  • Jejoab

    Jejoab

    4 NİSAN 2008
  • Matt Harding

    Matt Harding

    23 Mayıs 2006