2011-12-23 27 views
46

मेरे पास 2 डी सरणी के सूचक के बारे में कोई प्रश्न है। एक सरणी2 डी सरणी के लिए एक सूचक

int a[2][3]; 
तो

की तरह कुछ है, तो यह सरणी a के लिए सूचक है?

int (*p)[3] = a; 

यदि यह सही है, मैं सोच रहा हूँ क्या [3]int(*p)[3] से क्या मतलब है?

उत्तर

35

int[2][3] को '2 डी सरणी' के रूप में संदर्भित करने के बजाय, आपको इसे 'सरणी का सरणी' माना जाना चाहिए। यह एक सरणी है जिसमें दो आइटम हैं, जहां प्रत्येक आइटम स्वयं में 3 इंच के साथ एक सरणी है।

int (*p)[3] = a; 

आप a में दो आइटम में से किसी को इंगित करने के p उपयोग कर सकते हैं। p एक तीन-int सरणी को इंगित करता है - अर्थात्, ऐसा पहला आइटम। p+1 दूसरी तीन-int सरणी को इंगित करेगा। p प्रारंभ करने में दूसरा तत्व को इंगित करने के लिए, का उपयोग करें:

int (*p)[3] = &(a[1]); 

निम्नलिखित दो मदों की पहली को इंगित करने के बराबर तरीके हैं।

int (*p)[3] = a; // as before 
int (*p)[3] = &(a[0]); 
+2

उदाहरण के लिए आप '[3] ए' भी लिख सकते हैं :) यह सीखने का एक अच्छा तरीका है कि वास्तव में सी में कौन से सरणी हैं। – vsz

+0

@vsz, मैं अपना मन नहीं बना सकता कि यह वास्तव में अच्छा है, या वास्तव में पागल है :-) –

+9

@vsz: आपका मतलब है '3 [ए] '। –

5

[3] इस प्रकार का एक हिस्सा है। इस मामले में p आकार 3 की एक सरणी के लिए एक सूचक है जो स्याही रखता है।

विशेष प्रकार के सरणी में हमेशा इसका आकार शामिल होता है, ताकि आपके पास int *[3] या int *[5] प्रकार हों, लेकिन केवल int *[] नहीं है, जिसमें आकार को अपरिभाषित किया गया है।

int *x[20]; /* type of x is int *[20], not just int *[] */ 
int y[10][10]; /* type of y is int[10][10], not just int[][] */ 
+0

आपकी टिप्पणी के लिए धन्यवाद। जब आप आकार कहते हैं, तो इसका मतलब है (* पी) में [0], [1]], [2] है? यदि यह मामला है, तो [2] के लिए एक कमरा कहां है? या यह [0] [0] और [0] [1] को इंगित करता है? – user1047092

+0

'पी' बस 3 इन्स की सरणी के लिए एक सूचक है। यह नहीं जानता कि 'ए' का पहला आयाम 2 है, क्योंकि इसे 'ए' के पहले तत्व को सौंपा गया है, जो कि' int [3]' प्रकार का है। आपकी सहायता के लिए –

8

stricly बोल, नहीं, int (*p)[3] = a; नहीं a के लिए सूचक है। यह a के पहले तत्व के लिए एक सूचक है। a का पहला तत्व तीन चींटियों की एक सरणी है। p तीन स्याही की एक सरणी के लिए एक सूचक है।

सरणी a करने के लिए एक सूचक इस प्रकार घोषित किया जाएगा:

int (*q)[2][3] = &a; 

p और q के संख्यात्मक मान संभावना (या शायद होने के लिए आवश्यक) एक ही हैं, लेकिन वे विभिन्न प्रकार के कर रहे हैं। जब आप p या q पर अंकगणित करते हैं तो यह खेल में आ जाएगा। p+1 सरणी a के दूसरे तत्व को इंगित करता है, जबकि q+1 स्मृति a के अंत से परे स्मृति को इंगित करता है।

याद रखें: cdecl आपका मित्र है: int a[2][3], int (*q)[2][3]

37
int a[2][3]; 

a पूर्णांक की सरणी 3 की एक सरणी 2 जो केवल सरणियों की एक सरणी के रूप में पढ़ा जाता है। जब आप लिखते हैं,

int (*p)[3] = a;

यह पहला तत्व है जो एक सरणी है के सूचक के रूप p की घोषणा की। तो, p 3 चींटियों की सरणी को इंगित करता है जो सरणी के सरणी का तत्व है।

 int a[2][3] 
+----+----+----+----+----+----+ 
| | | | | | | 
+----+----+----+----+----+----+ 
\_____________/ 
     | 
     |  
     | 
     p int (*p)[3] 

यहाँ, p अपने सूचक है जिसमें 3 ints जो सरणियों की सरणी का एक तत्व है की सरणी ओर इशारा करता है:

इस उदाहरण पर विचार।

+0

वाह धन्यवाद। यह चित्र बहुत मदद करता है! ASCII कला के लिए – user1047092

+10

+1। और शुद्धता, मुझे लगता है। –

+0

"ए" के पहले मान को इंगित करने वाले पहले मान के साथ "पी" 3 पूर्णांक पॉइंटर्स की सरणी नहीं बन पाएगा? – Matthew

0

इसके अलावा नोट: -

पूर्णांक * p [5] // पी की एक सरणी के लिए 5 संकेत

पूर्णांक (* पी) [5] // पी अंक की एक सरणी है 5 इंच

int (* (पी +5)) [10] // पी संरचना के लिए एक सूचक है जहां संरचना के 5 वें तत्व में 10 इन्स हैं।

+0

यह पहले से ही उपयोगी उत्तरों की सूची में कैसे जुड़ता है? – rayryeng

+0

ओपी एक वैचारिक प्रश्न पूछता है और मैंने इसका उत्तर यहां दिया है। 5 डाल 3 के स्थान पर! इसके अलावा मैंने पॉइंटर्स का उपयोग करके 2 डी सरणी से मूल्य प्राप्त करने के तरीके के बारे में अधिक जानकारी दी है। – BigDataScholar

+0

मैं तर्क दूंगा कि यह यहां प्रदान किए गए बाकी उत्तरों की तुलना में अधिक भ्रमित है। – rayryeng

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