2011-12-07 7 views
17
int t[10]; 

int * u = t; 

cout << t << " " << &t << endl; 

cout << u << " " << &u << endl; 

उत्पादन:पता

0045FB88 0045FB88 
0045FB88 0045FB7C 

u के लिए उत्पादन समझ में आता है।

मुझे लगता है कि t और &t[0] समान मूल्य होना चाहिए, लेकिन &t भी कैसे समान है? & टी वास्तव में क्या मतलब है?

+4

¤ 'टी' में परिवर्तित 'टी' के बीच एकमात्र अंतर, और '& t', सूचक प्रकार है। उत्तरार्द्ध का संदर्भ औपचारिक रूप से सरणी प्रकार का है, ताकि इसमें 1 जोड़ना इसे थोड़ा सा (स्मृति में अगली ऐसी सरणी में) ले जायेगा।जबकि पूर्व का संदर्भ तत्व प्रकार का है। शब्दावली: [comp.lang.C++] यूज़नेट समूह में बाहर कुछ विवाद था कि आपके 'यू' जैसे पॉइंटर को सरणी को "इंगित करें" कहा जा सकता है, क्योंकि इसका संदर्भ सरणी प्रकार का नहीं है। इस तरह के शब्दों के मानक के उपयोग को इंगित करके इसे कई बार हल किया गया था। चीयर्स और एचटी।, –

+0

@ आधा यह नहीं था कि उस लड़के के साथ घूमने वाला पुल लड़का? –

+0

@ जोहान्सचैब-लिटब: हाँ –

उत्तर

18

जब t अभिव्यक्ति में स्वयं का उपयोग किया जाता है, तो एक सरणी-से-पॉइंटर रूपांतरण होता है, यह सरणी के पहले तत्व के लिए सूचक बनाता है।

t& ऑपरेटर के तर्क के रूप में उपयोग किया जाता है, ऐसा कोई रूपांतरण नहीं होता है। & तब स्पष्ट रूप से t (सरणी) का पता लेता है। &t पूरी तरह से सरणी के लिए एक सूचक है।

सरणी का पहला तत्व पूरे सरणी की शुरुआत के रूप में स्मृति में एक ही स्थिति पर है, और इसलिए इन दो पॉइंटर्स का एक ही मान है।

+0

धन्यवाद! मुझे लगता है कि यह अंतर्निहित सरणी-से-पॉइंटर रूपांतरण था जिसने मुझे एक सूचक होने की गलत मानसिकता दी। – quuxbazer

+0

@quuxbazer: 'u' _is_ एक सूचक। 't' _is_ एक सरणी। 'int * u = t' 't' में एक सरणी-से-पॉइंटर रूपांतरण लागू करता है, और परिणाम के साथ' u' प्रारंभ करता है। – Mankarse

+0

-1 सी ++ –

0

t सरणी का पता है, &t सरणी के लिए अभी भी सूचक है, इस प्रकार दिखाया गया पता समान है।

मुझे मिला एक अच्छा संदर्भ cplusplus forum है जो इस अवधारणा को बहुत अच्छी तरह से बताता है।

के रूप में वहाँ कहा गया है के बारे में &array:

यह अपवाद है, जहां नियम लागू नहीं होता है में से एक है। यह इसे सरणी के सूचक के रूप में लेता है। यह फिर से सरणी के पहले तत्व को इंगित करेगा, लेकिन यदि आप इस पॉइंटर में एक जोड़ते हैं, तो यह सरणी के अंतिम तत्व के ठीक बाद स्थान के पते को इंगित करेगा (जैसे आपने सरणी छोड़ी थी)।

+1

-1 "& t सरणी के पहले पते का संदर्भ है" गलत –

+0

@ AlfP.Steinbach कैसे है? & टी सरणी द्वारा उपयोग की गई स्मृति के ब्लॉक की शुरुआत का संदर्भ है, इस प्रकार, सरणी के पहले पते का संदर्भ है, जब तक कि मैं शब्द बदलकर अपने अर्थों को मिश्रित नहीं कर रहा हूं? – Serdalis

+0

'& t' कोई संदर्भ नहीं है। यह एक सूचक मूल्य है। ध्यान दें कि * * आपके पास सरणी का संदर्भ हो सकता है, लेकिन '& t' वह नहीं है। –

-2

t नामक कोई चर नहीं है, क्योंकि आप इसे बदल नहीं सकते हैं। नाम t बस पहले तत्व के पते को संदर्भित करता है (और इसके साथ एक आकार भी जुड़ा हुआ है)। इस प्रकार, पते का पता लेना वास्तव में समझ में नहीं आता है, और सी सिर्फ "पते" के रूप में पता चला है।

बात का एक ही प्रकार के कार्यों के मामले के लिए होता है:

int foo(void) 
{ 
    return 12; 
} 

printf("%p and %p\n", (void *) foo, (void *) &foo); 

यह एक ही बात प्रिंट चाहिए, क्योंकि वहाँ कोई चर foo का पता, बारी में जिसका पता लिया जा सकता है पकड़े है।

+1

यह सी ++ है, और 'टी' नामक चर है। आप इसे फ़ंक्शन पर पास कर सकते हैं जो 'int (&) [10] 'प्रकार के साथ तर्क स्वीकार करता है। – Abyx

+3

-1 "टी नामक कोई चर नहीं है, क्योंकि आप इसे बदल नहीं सकते हैं।" गलत है। एक ऑब्जेक्ट जिसे घोषणा में नामित किया गया है उसे एक चर कहा जाता है। मानक देखें। –

3

वास्तविक प्रकार tint[10] है, इसलिए &t सरणी का पता है।
इसके अलावा, int[] परोक्ष int* में बदलता है, तो t धर्मान्तरित सरणी सरणी के पहले तत्व का पता करने के लिए।

+2

नहीं, यह पहले तत्व के पते में परिवर्तित हो जाता है। पूर्ण स्मृति स्थान समान हैं, लेकिन प्रकार काफी अलग हैं। –

+0

@ बेनवोइग, हाँ, धन्यवाद। – Abyx

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