2012-02-12 19 views
10

मैंने यह सरल स्क्रिप्ट लिखी है कि यह समझने के लिए कि कोई संदर्भ क्या है, और मैं चार सरणी पर फंस रहा हूं।चार संदर्भ को समझना

3 
0xbffff958 
6 
0xbffff95c 
9 
0xbffff960 
12 
0xbffff964 
15 
0xbffff968 
-------------- 
a 
abcde 
b 
bcde 
c 
cde 
d 
de 
e 
int सरणी के साथ

जब मैं &numbers[i] उपयोग करते हैं, मैं एक अजीब संख्या है कि एक स्मृति स्थान है प्राप्त करते हैं,:

int numbers[5] = {3, 6, 9, 12, 15}; 

for (int i = 0; i < 5; i++) 
{ 
    cout << numbers[i] << endl; 
    cout << &numbers[i] << endl; 
} 

cout << "--------------" << endl; 

char letters[5] = {'a', 'b', 'c', 'd', 'e'}; 

for (int i = 0; i < 5; i++) 
{ 
    cout << letters[i] << endl; 
    cout << &letters[i] << endl; 
} 

और इस उत्पादन है। यह ठीक है; यह वही है जो मैंने समझा है।

लेकिन char के साथ, मुझे समझ में नहीं आता कि मेरे पास यह आउटपुट क्यों है।

+1

मैं अर्द्ध आश्चर्यचकित हूं कि दूसरे भाग ने नरक और पीठ को तोड़ दिया नहीं है, इस बात पर विचार करते हुए कि कोड कहता है, 'अक्षरों' को समाप्त नहीं किया जाता है। लेकिन फिर, यूबी का मतलब है "कुछ भी हो सकता है, यहां तक ​​कि कार्यक्रम स्पष्ट रूप से काम कर रहा है"। – cHao

+2

@cHao: डीबग मोड में संकलन करते समय कुछ कंपाइलर्स शून्य-बहुत सारी चीज़ें प्रारंभ करते हैं। शायद ओपी "भाग्यशाली" था। –

+1

मुझे आश्चर्य है कि किसी ने अभी तक इसका उल्लेख नहीं किया है लेकिन इसका संदर्भों के साथ कुछ लेना देना नहीं है। आप पॉइंटर्स के बारे में बात कर रहे हैं। –

उत्तर

13

कारण यह है कि cout "जानता है" char * मान के साथ क्या करना है - यह वर्ण स्ट्रिंग को एनयूएल-टर्मिनेटेड सी स्ट्रिंग के रूप में प्रिंट करता है।

यह int * मान का भी सत्य नहीं है, इसलिए cout इसके बजाय सूचक मूल्य मुद्रित करता है।

आप कास्टिंग द्वारा सूचक मूल्य उत्पादन के लिए मजबूर कर सकते हैं:

cout << static_cast<void *>(&letters[i]) << endl; 
2

आप सी ++ धाराओं का विशेष लक्षण देख रहे हैं। यह अपने तर्कों को आम तौर पर प्रिंट करने योग्य चीज़ों में बदलने की कोशिश करता है। इस अभिव्यक्ति का प्रकार &ints[x]int* है। &chars[x]char* बन जाता है जो संयोग से सी वर्ण स्ट्रिंग का प्रकार भी है। चूंकि हम पूरी स्ट्रिंग को मुद्रित करने के लिए यह cout << "FOO"' चाहते हैं, इसलिए यह व्यवहार करने की आवश्यकता है। आपके मामले में यह वास्तव में अपरिभाषित व्यवहार में परिणाम देता है क्योंकि आप जिस स्ट्रिंग का उपयोग कर रहे हैं वह उचित रूप से शून्य-समाप्त नहीं है। इस समस्या को हल करने के लिए static_cast का उपयोग करें।

2

जब आप ostream::operator<< (वास्तव में यह एक वैश्विक कार्य है, ऑपरेटर नहीं) टाइप char* के तर्क के रूप में, इसे शून्य-समाप्त स्ट्रिंग के रूप में माना जाता है।

+0

मैं मानक निर्दिष्ट नहीं करता कि यह ASCII होना चाहिए। –

+0

@MattiVirkkunen धन्यवाद! –

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