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

  • Jose LviS el Bambino ( JLB )   LviSito

    Jose LviS el

    3 ŞUBAT 2008
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008