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
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.
Arasındaki fark==[0]C=='\0' ...
Bir URI, URL ve URN arasındaki fark ne...
Aramak ve uygulamak arasındaki fark ne...
@Staticmethod ve @Python classmethod a...
Match_parent ve fill_parent arasındaki...