2011-05-25 14 views
9

मेरे पास int पॉइंटर्स int* arr[MAX]; की एक सरणी है और मैं अपना पता किसी अन्य चर में संग्रहीत करना चाहता हूं। पॉइंटर्स की सरणी में पॉइंटर कैसे परिभाषित किया जाए? अर्थात्:प्वाइंटर्स के एरे पॉइंटर

int* arr[MAX]; 
int (what here?) val = &arr; 

उत्तर

12

सिर्फ होना चाहिए:

int* array[SIZE]; 
int** val = array; 

एक पते-के ऑपरेटर असाइनमेंट ऑपरेटर के दाएँ हाथ की ओर पर निहित संकेत में सरणियों क्षय के बाद से array पर उपयोग करने के लिए कोई ज़रूरत नहीं है।

+0

लेकिन मैं एक सूचक को सरणी बनाना चाहता हूं, सरणी नहीं। – moteutsch

+0

@moteustch ठीक है, आपको सरणी के डेटा के लिए एक सूचक मिला है, जो _almost_ समान है। –

+4

हां, 'वैल '' int' पॉइंटर्स (अर्थात् बोलने वाले) की सरणी के लिए एक सूचक है ... यदि आपने 'val' का संदर्भ दिया है, तो आप फिर से अपने पॉइंटर्स की सरणी के साथ समाप्त हो जाएंगे, यानी, आप' * वैल) [INDEX] '। इसलिए चूंकि 'val'' int * 'की सरणी की शुरुआत में पता धारण कर रहा है, तो यह पॉइंटर्स की एक सरणी के लिए एक सूचक है। – Jason

1

IIRC, सरणियों परोक्ष संकेत के लिए परिवर्तनीय हैं, तो यह होगा:

int ** val = arr; 
+0

मुझे विश्वास है कि मिलान न प्रकार के लिए संकलक में फेंक और त्रुटि के बाद से 'arr' वास्तव में प्रकार के" सरणी के- संकेत-हैं- है जा रहा है "पॉइंटर-टू-इंट" की बजाय int ' – Jason

+0

Arrays पॉइंटर्स में परिवर्तनीय हैं ... लेकिन दूसरी तरफ गोल नहीं है। और पॉइंटर्स-टू-एरे पॉइंटर्स-टू-पॉइंटर्स के लिए पूरी तरह से परिवर्तनीय नहीं हैं। एट कैटर, एट कैटर – Kos

+0

लेकिन यदि एक सरणी एक सूचक के लिए परिवर्तनीय है तो मूल सरणी 'int ** arr' के समान नहीं होगी? तो '& arr'' int ***' होगा, नहीं? – moteutsch

0

जहाँ तक मुझे पता के रूप में वहाँ कोई विशेष प्रकार c में "पूर्णांकों की सरणी" है, इस प्रकार यह है इसके लिए एक विशिष्ट सूचक होना असंभव है। एकमात्र चीज जो आप कर सकते हैं वह int: int* पर पॉइंटर का उपयोग करना है, लेकिन आपको खाते में int और अपनी सरणी लंबाई का आकार लेना चाहिए।

+0

'int []' पूर्णांक की एक सरणी है और यह * int * 'से * अलग * है, लेकिन फ़ंक्शन तर्क के रूप में या संदर्भ में जहां पॉइंटर अंकगणित किया जाता है, में अंतर्निहित रूप से 'int *' को क्षय हो जाएगा। – dmckee

+0

सी निश्चित रूप से सरणी प्रकार है और वे सूचक प्रकार के बराबर नहीं हैं, अगर आप यही सोच रहे हैं। 'Int main() {int a [1] = {0} संकलित करने का प्रयास करें; int i; एक = और मैं; वापसी 0; } ' –

+0

सरणी प्रकारों और सूचक प्रकारों के बीच सबसे महत्वपूर्ण अंतर यह है कि वे 'sizeof' का जवाब कैसे देते हैं। – Kos

19

सही जवाब है:

int* arr[MAX]; 
int* (*pArr)[MAX] = &arr; 

या बस:

 int* arr [MAX]; 
typedef int* arr_t[MAX]; 

arr_t* pArr = &arr; 

अंतिम भाग पढ़ता है "के रूप में पैर प्रकार सूचक int करने के मैक्स तत्वों की सरणी के लिए सूचक है"।

सी में सरणी के आकार को प्रकार में संग्रहीत किया जाता है, मूल्य में नहीं। यदि आप चाहते हैं कि यह सूचक सही ढंग से सरणी पर पॉइंटर अंकगणितीय को संभालने के लिए चाहता है (यदि आप उनमें से 2-डी सरणी बनाना चाहते हैं और इस पॉइंटर को फिर से चालू करने के लिए उपयोग करना चाहते हैं), आप - अक्सर दुर्भाग्य से - होने की आवश्यकता है सूचक प्रकार में एम्बेडेड सरणी आकार।

सौभाग्य से, सी 99 और वीएलए (शायद सी 99 से पहले भी?) MAX को रन-टाइम में निर्दिष्ट किया जा सकता है, समय संकलित नहीं किया जा सकता है।

-1

इस स्रोत http://unixwiz.net/techtips/reading-cdecl.html के अनुसार, "सही जाने के लिए आप, छोड़ दिया जाने कर सकते हैं जब जब तुम चाहिए" नियम, हम पिछले जवाब में दी गई घोषणाओं के निम्नलिखित 2 अर्थ मिल का उपयोग करके -

int **val ==> val is a pointer to pointer to int 
int* (*pArr)[MAX] ==> pArr is a pointer to an array of MAX length pointers to int. 

मुझे आशा है कि उपर्युक्त अर्थ समझ में आ जाएंगे और यदि वे नहीं करते हैं, तो उपर्युक्त स्रोत को समझना शायद एक अच्छा विचार होगा।

अब यह स्पष्ट होना चाहिए कि दूसरी घोषणा वह है जो मोटेत्शेक की तलाश में है क्योंकि यह पॉइंटर्स की एक सरणी के लिए एक सूचक घोषित करता है।

तो पहला व्यक्ति भी क्यों काम करता है? याद रखें कि

int* arr[MAX] 

पूर्णांक संकेत की एक सरणी है। तो, वैल एक पॉइंटर है, जो इंट पॉइंटर सरणी के अंदर घोषित पहली int के सूचक है।

0

मेरा मानना ​​है कि जवाब बस है:

int **val;<br> 
val = arr; 
संबंधित मुद्दे