SORU
16 AĞUSTOS 2013, Cuma


İşaretçi değerleri farklı ama eşit karşılaştırır. Neden?

Kısa bir örnek tuhaf bir sonuç çıktılar!

#include <iostream>

using namespace std;

struct A { int a; };    
struct B { int b; };
struct C : A, B
{
    int c;
};

int main()
{
    C* c = new C;
    B* b = c;

    cout << "The address of b is 0x" << hex << b << endl;
    cout << "The address of c is 0x" << hex << c << endl;

    if (b == c)
    {
        cout << "b is equal to c" << endl;
    }
    else
    {
        cout << "b is not equal to c" << endl;
    }
}

Çıktı aşağıdaki gibi olmalıdır

The address of b is 0x003E9A9C
The address of c is 0x003E9A98
b is equal to c

Beni merak ne yapar:

0x003E9A9C 0x003E9A98, ama çıkış olduğu için eşit değil "b, c eşittir"

CEVAP
16 AĞUSTOS 2013, Cuma


Türünde bir nesne C bellek düzeni bu gibi bir şey olacaktır

|   <---- C ---->   |
|-A: a-|-B: b-|- c -|
0      4      8     12

Nesnenin Adresi bayt (sizeof(int) = 4 senin gibi bir platformda) mahsup ekledim.

Senin ana, iki işaretçiler var, açıklık getirmek için pb pc bunları değiştirmeyi düşünüyorum. pc pb B sınıfın: başlangıç noktaları ise tüm C nesnesinin Başlangıç noktaları

   |   <---- C ---->   |
   |-A: a-|-B: b-|- c -|
   0      4      8     12
pc-^   pb-^

Bu değerleri farklıdır nedeni de budur. 3E9A98 4 hex 3E9A9C.

Eğer şimdi bu iki işaretçileri karşılaştırın, derleyici B* ve farklı türleri olan C*, arasında bir karşılaştırma göreceksiniz. Eğer bir tane varsa bir örtük dönüştürme uygulamak gerekiyor. pb C* ama yuvarlak mümkündür diğer taraftan bir dönüştürülemez - B* pc dönüştürür. Bu dönüşüm B* pb = pc; tanımlanan pc aynı örtülü dönüşüm noktaları her yerde B sınıfın kullanılan işaret eden bir işaretçi verirler. Sonuç pb, belli ki eşittir:

   |   <---- C ---->   |
   |-A: a-|-B: b-|- c -|
   0      4      8     12
pc-^   pb-^
   (B*)pc-^

İki işaretçiler karşılaştırırken, aslında derleyici eşit olan dönüştürülmüş göstericiler, karşılaştırır.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AmazonWireless

    AmazonWirele

    8 EYLÜL 2010
  • LIVESTRONG.COM

    LIVESTRONG.C

    5 EKİM 2005
  • TheForgottenGamer1

    TheForgotten

    28 AĞUSTOS 2009