Bir C işaretçisini NULL olarak başlatmak mümkün müdür?
TL; DR Evet, çok fazla.
Kılavuz üzerinde yapılan fiili iddiası gibi okur
Öte yandan, yalnızca ilk atamayı kullanırsanız, int *my_int_ptr = 2;
program, işaret ettiği bellek konumunun içeriğini my_int_ptr
2 değeri ile doldurmaya çalışacaktır. my_int_ptr
Çöp ile dolu olduğu için herhangi bir adres olabilir. [...]
Eh, onlar vardır haklısınız, yanlış.
İfade için, ( şimdilik, tamsayıya dönüşüme göstericinin uygulama tanımlı bir davranış olduğu gerçeğini göz ardı ederek )
int * my_int_ptr = 2;
my_int_ptr
Bir değişken (tip işaretçi için int
(: tamsayı ibrenin adres türü), Eğer bir değer depolamak), kendine ait bir adres vardır 2
içine bu adresi.
Şimdi my_int_ptr
, bir işaretçi türü olan, bunun, diyebiliriz işaret hafıza yerde "tip" değerine göre işaret düzenlenen değeri my_int_ptr
. Yani, aslında değer atama ait işaretçi değişkeni, hafıza konumu değil değer gösterici ile gösterilen.
Yani, sonuç için
char *x=NULL;
işaretçi değişkeni başlatır x
için NULL
değil, bellek adresinde değeri gösterici ile gösterilen .
Bu aynı şekilde
char *x;
x = NULL;
Genişleme:
Şimdi, kesinlikle uyumlu olarak, şöyle bir ifade
int * my_int_ptr = 2;
kısıtlama ihlali içerdiğinden yasa dışıdır. Açık olmak gerekirse,
my_int_ptr
bir işaretçi değişkendir, tür int *
- bir tamsayı sabiti, tanımı gereği
2
türe sahiptir int
.
o tarif / P1, §6.5.16.1 bölümde belirtilen, basit atama kurallarını ihlal ettiği için bu başlatma geçersiz yüzden onlar, "uyumlu" tip değildirler Lundin cevabı .
Başlatma işleminin basit atama kısıtlamalarıyla nasıl bağlantılı olduğu ile ilgilenen varsa, alıntı C11
, bölüm §6.7.9, P11
Skaler için başlatıcı, isteğe bağlı olarak parantez içine alınmış tek bir ifade olacaktır. Nesnenin başlangıç değeri, ifadenin değeridir (dönüştürmeden sonra); Basit atamayla aynı tür kısıtlamaları ve dönüştürmeleri geçerlidir, skalerin türünü, bildirilen türünün nitelenmemiş sürümü olarak alır.
int *x = whatever;
yaptığı ile neint *x; *x = whatever;
yaptığı arasında çok kafa karıştırıcı bir fark var.int *x = whatever;
aslındaint *x; x = whatever;
değil gibi davranıyor*x = whatever;
.