Not: Bu cevap C ++ için değil C dili için geçerlidir.
Boş İşaretçiler
Tamsayı sabit değişmezi 0
, kullanıldığı bağlama bağlı olarak farklı anlamlara sahiptir. Her durumda, hala değeri olan bir tamsayı sabitidir0
, sadece farklı şekillerde açıklanır.
Bir işaretçi sabit değişmez değerle karşılaştırılıyorsa 0
, bu işaretçinin boş bir işaretçi olup olmadığını kontrol eder. Bu 0
daha sonra bir boş işaretçi sabiti olarak adlandırılır. C standardı, bu 0
türevoid *
hem boş gösterici hem de boş gösterici sabiti .
Ayrıca, okunabilirliğe yardımcı olmak için makro NULL
başlık dosyasında bulunur stddef.h
. Derleyicinize bağlı olarak aşağıdakileri yapmak mümkün olabilir:#undef NULL
tuhaf bir şeye yeniden tanımlamak .
Bu nedenle, boş bir işaretçiyi kontrol etmenin bazı geçerli yolları şunlardır:
if (pointer == NULL)
NULL
bir boş göstergeye eşit karşılaştırmak için tanımlanır. NULL
Geçerli bir boş işaretçi sabiti olduğu sürece , gerçek tanımının ne olduğu tanımlanmış bir uygulamadır .
if (pointer == 0)
0
null işaretçi sabitinin başka bir temsilidir.
if (!pointer)
Bu if
ifade "0 değil" örtük olarak kontrol eder, bu nedenle "0" anlamına gelmesini tersine çeviririz.
Boş gösterici olup olmadığını kontrol etmek için GEÇERSİZ yöntemler şunlardır:
int mynull = 0;
<some code>
if (pointer == mynull)
Derleyici için bu bir boş gösterici için bir denetim değil, iki değişken üzerinde bir eşitlik denetimi. Bu olabilirMynull kodda hiçbir zaman değişmezse ve derleyici optimizasyonları sabit değeri 0 ifadesini if ifadesine katlarsa yarayabilir, ancak bu garanti edilmez ve derleyicinin C Standardına göre en az bir tanı mesajı (uyarı veya hata) üretmesi gerekir.
C dilinde null işaretçi olduğunu unutmayın. Temel mimaride önemli değil. Temel mimarinin 0xDEADBEEF adresi olarak tanımlanan bir boş işaretçi değeri varsa, bu karmaşayı sıralamak derleyiciye kalmıştır.
Bu nedenle, bu komik mimaride bile, aşağıdaki yollar boş bir işaretçiyi kontrol etmek için hala geçerli yollardır:
if (!pointer)
if (pointer == NULL)
if (pointer == 0)
Boş gösterici olup olmadığını kontrol etmek için GEÇERSİZ yöntemler şunlardır:
#define MYNULL (void *) 0xDEADBEEF
if (pointer == MYNULL)
if (pointer == 0xDEADBEEF)
çünkü bunlar bir derleyici tarafından normal karşılaştırmalar olarak görülür.
Boş Karakterler
'\0'
null bir karakter olarak tanımlanır - bu, tüm bitlerin sıfıra ayarlandığı bir karakterdir. Bunun işaretçilerle bir ilgisi yok. Ancak bu koda benzer bir şey görebilirsiniz:
if (!*string_pointer)
dize işaretçisinin boş bir karakteri gösterip göstermediğini kontrol eder
if (*string_pointer)
dize işaretçisinin boş olmayan bir karakteri gösterip göstermediğini kontrol eder
Bunları boş göstericilerle karıştırmayın. Sadece bit temsili aynı olduğundan ve bu durum bazı uygun çapraz geçişlere izin verdiği için, gerçekten aynı şey değildir.
Ayrıca, '\0'
(tüm karakter değişmezleri gibi) bir tamsayı sabiti, bu durumda sıfır değeri ile. Yani '\0'
tamamen süslenmemiş bir 0
tamsayı sabitine eşdeğerdir - tek fark, bir insan okuyucuya iletme niyetindedir ("Bunu boş karakter olarak kullanıyorum").
Referanslar
Daha fazla bilgi için comp.lang.c SSS'nin 5.3 bölümüne bakın . C standardı için bu pdf'ye bakın . 6.3.2.3 İşaretçiler, paragraf 3 bölümlerine bakın.