İş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
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.
Neden JavaScript iki farklı sayılar eş...
Neden nesne yerine bir işaretçi kendis...
C ve C her ikisi içinde geçerli bir ko...
Neden Python karşılaştırma dizeleri ku...
Neden 2 40 42 eşit oluyor?...