SORU
10 AĞUSTOS 2011, ÇARŞAMBA


Neden NULL işaretçiler farklı C ve C olarak tanımlanan ?

C ise C, NULL (void *)0 olarak tanımlanır 0. Neden böyle? C NULL (void *) typecast değilse o zaman Derleyiciler Mayıs/uyarı verebilir olmadığını anlayabiliyorum. Bunun dışında başka bir sebep var mı?

CEVAP
10 AĞUSTOS 2011, ÇARŞAMBA


C , null işaretçi ISO belirtimi (&Mezhebi;4.10/1) olarak tanımlanır

Bir null işaretçi sürekli sıfır veren tamsayı türü (5.19) integral sabiti bir rvalue.

Bu C yazabilirsiniz nedeni budur

int* ptr = 0;

C, bu kural benzer, ama biraz farklı (ve mezhep;6.3.2.3/3):

Değeri 0 veya türü için böyle bir ifade dökme ile bir tamsayı sabit ifadesi * *20, null gösterici sabiti denir.Eğer bir null işaretçi bir dönüştürülürse 55) işaretçi türü, elde edilen işaretçi, boş bir işaretçi olarak adlandırılan, eşitsiz karşılaştırın garantilidir herhangi bir nesne veya işlev işaretçisi için.

Sonuç olarak, her ikisi de

int* ptr = 0;

ve

int* ptr = (void *)0

yasal. Ancak, benim tahminim void* dökme burada ifadeleri gibi

int x = NULL;

çoğu sistemde derleyici bir uyarı üretir. C , bu örtülü olarak void* bir işaretçi türü örtülü olarak bir dökme olmadan dönüştürebilirsiniz. çünkü yasal olmaz. Örneğin, bu yasadışı

int* ptr = (void*)0; // Legal C, illegal C  

Ancak, bu kod nedeniyle sorunlara yol açar

int x = NULL;

yasal C . Bu ve bunu izleyen karışıklık (ve başka bir durumda, daha sonra gösterilen) nedeniyle, C 11 şimdi bir anahtar kelime nullptr boş bir işaretçi temsil eder:

int* ptr = nullptr;

Bu yukarıdaki sorunlardan herhangi biri yok.

0 nullptr diğer avantajı C tipi sistem ile daha iyi oynar. Örneğin, bu iki işlevi olduğunu varsayalım:

void DoSomething(int x);
void DoSomething(char* x);

Eğer ararsam

DoSomething(NULL);

Denk

DoSomething(0);

DoSomething(int) çağıran yerine beklenen DoSomething(char*). Ancak, nullptr ile yazabilirim

DoSomething(nullptr);

Ve beklendiği gibi DoSomething(char*) işlevini çağırır.

Benzer şekilde, vector<Object*> bir ben var ve her öğenin null bir işaretçi olarak ayarlamak istediğiniz varsayalım. std::fill algoritması kullanarak, yazmayı deneyebilirim

std::fill(v.begin(), v.end(), NULL);

Ancak, bu şablon sistemi int ve bir işaretçi olarak NULL işler için bir derleme, yok. Bunu düzeltmek için yazmam gerekiyor

std::fill(v.begin(), v.end(), (Object*)NULL);

Bu çirkin ve biraz şablon sisteminin amacı yendi. Bunu düzeltmek için, nullptr kullanabilirsiniz:

std::fill(v.begin(), v.end(), nullptr);

Ve nullptr bir tür, bir null işaretçi ilgili olduğu bilinmektedir beri (özellikle std::nullptr_t), bu doğru derlenir.

Bu yardımcı olur umarım!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Cristina Landa

    Cristina Lan

    28 Ocak 2010
  • JTechTalk

    JTechTalk

    11 Temmuz 2010
  • NewsyTech

    NewsyTech

    2 AĞUSTOS 2010