2013-06-13 11 views
9

मैं C++ Primer पढ़ रहा था और मैंने देखा वहाँ एक बयान है कि कहते हैं:क्या किसी संदर्भ में पॉइंटर को परिभाषित करना संभव है?

Because references are not objects, they don't have addresses. Hence, we may not define a pointer to a reference.

लेकिन मैं सिर्फ एक उदाहरण कोड लिखा था और पता चलता है कि यह एक संदर्भ (d चर) के लिए सूचक बनाने के लिए संभव है।

कोड के नीचे पोस्ट किया जाता है:

#include <iostream> 
using namespace std; 

int main(){ 
    int a = 1024; 

    int &b = a; // a reference to int 
    int &c = b; // a reference to another reference 
    int *d = &b; // a pointer to a reference 
    int *(&e) = d; // a reference to a pointer 

    a = 100; 
    cout << b << endl; 
    cout << c << endl; 
    cout << *d << endl; 
    cout << *e << endl; 
} 

तो, कुछ भी अपने परीक्षण के साथ गलत? या C++ Primer में बयान गलत है?

मैं C++ Primer पांचवां संस्करण पढ़ रहा हूं। बयान पृष्ठ 52, 2.3.2 में है।

+0

@taocp oops, संपादित :-) – yegle

+2

'e' 'int और (* e) = d;' पर स्विच करें और आपको त्रुटि मिलती है: जीसीसी से 'int' 'को पॉइंटर घोषित नहीं किया जा सकता है। इससे यह स्पष्ट हो जाता है कि 'डी' संदर्भ के लिए सूचक नहीं है। – chris

+0

मूल वस्तु के उपनाम के रूप में संदर्भ के बारे में सोचें। संदर्भ आवंटित नहीं करते हैं, स्मृति स्मृति। जैसा कि बताया गया है कि आप उपनाम नाम से संदर्भित ऑब्जेक्ट को इंगित कर सकते हैं, लेकिन उपनाम का प्रतिनिधित्व करने के लिए स्मृति में कुछ भी नहीं है (यह केवल कोड में है)। इसके विपरीत एक सूचक स्मृति को आवंटित करता है और एक मूल्य संग्रहीत करता है (भले ही मान न्यूल हो)। –

उत्तर

9

उद्धरण सही है, क्योंकि आप मूल वस्तु को इंगित करने वाले पॉइंटर बना रहे हैं, न कि इसका संदर्भ।

#include <stdio.h> 
#include <stdlib.h> 

int main() { 
    int a = 0; 
    // two references referring to same object 
    int& ref1_a = a; 
    int& ref2_a = a; 
    // creating a different pointer for each reference 
    int* ptr_to_ref1 = &ref1_a; 
    int* ptr_to_ref2 = &ref2_a; 

    printf("org: %p 1: %p 2: %p\n", &a, ptr_to_ref1, ptr_to_ref2); 

    return 0; 
} 

उत्पादन:

org: 0x7fff083c917c 1: 0x7fff083c917c 2: 0x7fff083c917c 

यदि आप ने कहा आप संदर्भ के लिए एक सूचक करने में समर्थ हैं, तो इसके बाद के संस्करण उत्पादन भिन्न होना चाहिए नीचे दिए गए कोड इस तथ्य को दर्शाता है।

+1

'printf' को' printf में बदलें ("0:% X 1:% X 2:% X \ n", और a, ptr_to_ref1, ptr_to_ref2); 'इसे और अधिक स्पष्ट बना देगा :-) – yegle

+2

सामान्य स्टैक ओवरफ्लो नाइटपिकिंग में शामिल होना, printf में% p प्लेसहोल्डर होना चाहिए,% x (64-बिट पॉइंटर्स बनाम 32-बिट इन्ट्स, याडा याडा) नहीं होना चाहिए। एक अच्छा स्पष्टीकरण के लिए वैसे भी +1। – Yamodax

+0

@yegle: अच्छा बिंदु। मैंने इसे अपने नमूना कोड में शामिल किया है। धन्यवाद! – keelar

7

पुस्तक कहां सही है। आपका सूचक एक संदर्भ को इंगित कर रहा है, संदर्भ के लिए नहीं (बी) क्योंकि संदर्भ स्वयं (बी) स्मृति में मौजूद नहीं है और इस प्रकार कोई पता नहीं है।

+3

संदर्भ * हो सकता है * स्मृति हो, उदाहरण के लिए यदि यह किसी फ़ंक्शन में पारित हो जाती है - संकलक इसे आंतरिक रूप से एक सूचक के रूप में कार्यान्वित कर सकता है। हालांकि यह कार्यान्वयन आपके सामने प्रकट नहीं हुआ है। –

+0

आप बिल्कुल सही हैं। – Yamodax

5

नहीं, आप किसी संदर्भ में सूचक नहीं बना सकते हैं। यदि आप उस पते के ऑपरेटर & का पता उपयोग करते हैं तो आपको उस ऑब्जेक्ट का पता मिलता है जिसका आप संदर्भ दे रहे हैं, संदर्भ स्वयं नहीं।

0

मूल वस्तु के उपनाम के रूप में संदर्भ के बारे में सोचें। संदर्भ आवंटित नहीं करते हैं, स्मृति स्मृति। जैसा कि बताया गया है कि आप उपनाम नाम से संदर्भित ऑब्जेक्ट को इंगित कर सकते हैं, लेकिन उपनाम का प्रतिनिधित्व करने के लिए स्मृति में कुछ भी नहीं है (यह केवल कोड में है)। इसके विपरीत एक सूचक स्मृति को आवंटित करता है और एक मूल्य संग्रहीत करता है (भले ही मान न्यूल हो)।

संबंधित मुद्दे

 संबंधित मुद्दे