मैंने हाल ही में कंसोल पर कई पॉइंटर्स के मूल्यों को मुद्रित करके एक छोटा प्रोग्राम डीबग करने का प्रयास किया। पहला एक संरचना का स्मृति पता था, और अन्य अपने खेतों के स्मृति पते थे।पहले क्षेत्र में संरचना या कक्षा बनाम पॉइंटर के सूचक सूचक
#include <iostream>
struct testingPointers
{
int i;
float f;
double d;
} test;
int main()
{
std::cout << &test << '\n' << &(test.i) << '\n' <<
&(test.f) << '\n' << &(test.d);
}
और उत्पादन होता है:
0x681110
0x681110
0x681114
0x681118
(स्पष्ट रूप से सटीक मान अलग रन के लिए अलग-अलग हैं लेकिन वे हमेशा के सापेक्ष एक ही स्थिति है कोड का एक छीन नीचे संस्करण इस प्रकार है एक दूसरे)।
मैं उलझन में हूं क्योंकि पहले पॉइंटर का मूल्य - test
की मेमोरी लोकेशन - दूसरे की तरह ही है (test
का पहला फ़ील्ड)। क्या इसका मतलब यह है कि वस्तुओं के पास कोई वास्तविक अद्वितीय स्मृति पता नहीं है, और यह कि एक संरचना या वर्ग के लिए सूचक केवल अपने पहले क्षेत्र को इंगित करता है? यदि हां, तो कैसे करना
a.b
a->b
a.b()
मेकअप भावना की तरह बयान करता है, तो a
वास्तव में सिर्फ अपनी पहली क्षेत्र है, और इसलिए किसी भी फ़ील्ड या विधियां नहीं हैं?
नहीं, वे विभिन्न प्रकार के पॉइंटर्स हैं। लेकिन पहला क्षेत्र वस्तु की शुरुआत में स्थित है। तो यह एक ही प्रारंभिक पता है। (जब तक शुरुआत में एक vtable सूचक या कुछ नहीं है।) –
यदि मेरे सिर के शीर्ष पर एक पॉइंटर भी मेरे सिर के शीर्ष पर एक सूचक है तो इसका मतलब है कि मैं अस्तित्व में नहीं हूं क्योंकि मैं वास्तव में सिर्फ एक सिर हूं? –
@MooingDuck डरावना। –