2011-12-29 23 views
7

मैं निम्नलिखित कोड का टुकड़ा है:दो आयामी सरणी और संकेत

char board[3][3] = { 
        {'1','2','3'}, 
        {'4','5','6'}, 
        {'7','8','9'} 
        }; 

printf("address of board : %p\n", &board); 
printf("address of board[0] : %p\n", &board[0]); 

दोनों printf() बयान सभी प्रिंट एक ही मूल्य: 0x0013ff67

  1. मेरी जानकारी के अनुसार, बोर्ड (यानी) सरणी नाम पहले subarray (यानी) board[0] और

  2. board[0] repres के पते का प्रतिनिधित्व करता है पहली सरणी में पहला तत्व का पता दिखने वाले Ents हैं (यानी) board[0][0]

मैं अपने सभी printf() बयान में एक ही पते क्यों मिल रहा है? मैं दोनों बयानों के लिए अलग-अलग पते की उम्मीद करता हूं।

मैं इस सामान के लिए बहुत नया हूं और इस व्यवहार को समझ नहीं पा रहा हूं। कृपया मुझे प्रबुद्ध करें।

उत्तर

1

मेरी जानकारी के अनुसार, बोर्ड (यानी) सरणी नाम पहले subarray (यानी) बोर्ड के [0]

यह वह जगह है ही अगर सच board इन संदर्भों के बाहर प्रयोग किया जाता है

पते का प्रतिनिधित्व करता है
  • & ऑपरेटर
  • के संकार्य sizeof
के संकार्य के रूप में के रूप में

जब इनमें से कोई भी लागू होता है, अभिव्यक्ति board सरणी का प्रतिनिधित्व करती है और सरणी के प्रकार (char[3][3]) रखती है। & ऑपरेटर को लागू करने के परिणामस्वरूप सरणी का पता प्राप्त होता है, जो निश्चित रूप से इसके पहले तत्व के पते के बराबर होता है, केवल char(*)[3] के बजाय एक अलग प्रकार (char(*)[3][3]) होता है। सरणी board के बारे में भी यही सच है इसके पहले उप सरणी board[0] के बारे में सच है।

जब आप इसे उन संदर्भों के बाहर उपयोग करते हैं, तो आपको पहले तत्व का पता मिलता है (आपके मामले में सबएरे)। वह पता एक वस्तु नहीं है बल्कि सिर्फ एक मूल्य है। मूल्य का कोई पता नहीं है, लेकिन वस्तुओं के पास है। & को लागू करने का प्रयास करने में विफल रहेगा। उदाहरण के लिए

// error: trying to apply '&' on something that has no address 
&(1 ? board : board) 

ध्यान दें कि उपर्युक्त कुछ भी ऊपर लागू होता है; सी ++ के लिए जरूरी नहीं है।

+0

आपकी प्रतिक्रिया के लिए हाय धन्यवाद और मैं आंशिक रूप से समझता हूं। क्या आप अपनी टिप्पणी समझाते हुए एक सरल नमूना कार्यक्रम प्रदान कर सकते हैं। मैं बहुत मददगार होगा। धन्यवाद। – intex0075

+0

@intex आपका प्रश्न * है * सरल उदाहरण प्रोग्राम जो मैं प्रदान करता हूं। –

5

हालांकि यह 2 डी सरणी है, स्मृति के अंदर इसे रैखिक सरणी के रूप में दर्शाया जाएगा। तो जब आप कहते हैं, बोर्ड [0] [0] यह अभी भी उस रैखिक सरणी में पहले तत्व को इंगित करता है और इसलिए एक ही स्मृति पता।

1

बेशक यह वही पता मुद्रित करेगा।
एक मिनट के लिए इस तरह 2 डी सरणियों के बारे में सोचो,

पूर्णांक ** ptr;


पता *ptr बराबर &(**ptr) करता है।

मूल रूप से, आपका कोड यही कर रहा है।

और याद रखें कि स्मृति में, 2 डी सरणी रैखिक रूप से मैप की जाएगी।

1

यह मामला हो सकता है कि आप ऑब्जेक्ट उन्मुख भाषा जैसे जावा या पायथन जानते हैं, और अब आप सी भाषा सीख रहे हैं। char board[3][3] के बारे में सोचते समय जावा और सी के बीच का अंतर यह है कि सी board चर में स्मृति में 9 अक्षरों को आसन्न स्मृति पते पर दर्शाया गया है। इसलिए जैसा:

board: 1 2 3 4 5 6 7 8 9 

सी में, &board&board[0] और &board[0][0] रूप में एक ही स्मृति पता अर्जित करता है।

इस के विपरीत, जावा में चर char[][] board के रूप में घोषित किया जाएगा और इसकी स्मृति प्रतिनिधित्व धारणात्मक इस प्रकार दिखाई देगा:

board: ptr(A) ptr(B) ptr(C) 
A:  1 2 3 
B:  4 5 6 
C:  7 8 9 

जहां x की स्मृति पते पर ptr(x) अंक। तो, जावा में, boardboard[0] से भिन्न स्मृति पते पर इंगित करता है।


आप सी में कहते हैं, & बोर्ड & बोर्ड [0] और & बोर्ड के रूप में ही स्मृति पता पैदावार [0] [0]। लेकिन मैं केवल बोर्ड [0] [0] (या) * बोर्ड [0] (या) ** बोर्ड के माध्यम से पहले तत्व तक पहुंचने में सक्षम हूं। ऐसा क्यों है??

हालांकि भाव &board और &board[0] और &board[0][0] एक ही पते उपज, सी भाषा के प्रकार प्रणाली char मूल्य तक पहुँचने से रोक रही है। एक सी संकलक में, प्रकार (धारणात्मक) कर रहे हैं:

board:  type char[3][3] 
board[0]: type char[3] 
board[0][0]: type char 

प्रकार char के एक चर मान लिया जाये कि, हम लिख सकते हैं:

char c; 
c = board[0][0]; 

लेकिन नहीं लिख सकते हैं:

char c; 
c = board; // Error 
c = board[0]; // Error 

क्योंकि बाएं तरफ टाइप करें असाइनमेंट के दाहिने तरफ के प्रकार के साथ असंगत है।

आप यह सुनिश्चित करें कि एक char के लिए एक भाषण अंक, आप एक प्रकार डाली का उपयोग कर सकते हैं:

char c; 
c = *(char*)board; // Works OK 
c = *(char*)board[0]; // Works OK 

नकारात्मक पक्ष यह है कि इस तरह के प्रकार डाले कोडिंग कीड़े को जन्म दे सकती है।

+0

आप सी में कहते हैं, और बोर्ड समान स्मृति पता और बोर्ड [0] और बोर्ड [0] [0] उत्पन्न करता है। लेकिन मैं केवल बोर्ड [0] [0] (या) * बोर्ड [0] (या) ** बोर्ड के माध्यम से पहले तत्व तक पहुंचने में सक्षम हूं। ऐसा क्यों है?? – intex0075

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