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_ptr2 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_ptrBir 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 2iç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 xiçin NULLdeğ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
2tü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;.