2016-02-22 7 views
8

मैं सी ++ में एक कोड प्रोग्रामिंग कर रहा था जब मैंने गलती से मेरे पॉइंटर को ब्रैकेट लगाए और मेरे प्रोग्राम आउटपुट बदल गए।इन प्रकार के पॉइंटर्स के बीच अंतर क्या हैं?

जब से मैं प्रोग्रामिंग करने के लिए नया मैं संकेत के इन प्रकार के बीच का अंतर जानना चाहता था हूँ:

int* A[n]; 
int (*A)[n]; 
int *(A[n]); 

मैं अपने पाठ्यपुस्तक कि सरणियों भी संकेत दिए गए का एक प्रकार है में पढ़ा है।

+1

Arrays * अपने पहले तत्व के लिए एक सूचक को * क्षय * कर सकते हैं, लेकिन यह एक सूचक नहीं है। उदाहरण के लिए, जब आप किसी फ़ंक्शन में सरणी पास करते हैं या पॉइंटर अंकगणित का उपयोग करते हैं तो यह क्षय होता है। –

+1

@ जोचिमपिलबोर्ग जब आप किसी फ़ंक्शन में सरणी पास करते हैं * जिसका पैरामीटर एक पॉइंटर * है। यह मूल रूप से किसी ऐसे पॉइंटर को प्रारंभ करने या असाइन करने के लिए किसी सरणी के नाम का उपयोग कर रहा है, जो किसी फ़ंक्शन को पास नहीं करता है। – juanchopanza

+0

घड़ी के सर्पिल नियम को सीखें और आप कभी भी जटिल घोषणाओं के बारे में कभी भ्रमित नहीं होंगे। http: // stackoverflow।कॉम/ए/3178 9 222/3758484 – johnbakers

उत्तर

15
int* A[n]; 

पहला और सबसे महत्वपूर्ण तत्व है कोई फर्क नहीं पड़ता कि तत्व किस प्रकार है। पॉइंटर * लागू करने के बाद, हम जानते हैं कि ए int पॉइंटर्स की एक सरणी है।

int (*A)[n]; 

ब्रैकेट्स लागू करके, पॉइंटर * इस मामले में सरणी [] पर अधिक प्राथमिकता है। फिर ए सबसे पहले और सबसे महत्वपूर्ण सूचक है इससे कोई फर्क नहीं पड़ता कि यह क्या इंगित कर रहा है। सरणी लागू करने के बाद [], हम जानते हैं कि ए int की एक सरणी के लिए एक सूचक है।

int *(A[n]); 

कोष्ठक किसी भी पूर्वता आदेश है कि आपके 1 मामले के रूप में प्रभावित करेगा सरणी [], इसलिए दूर करने कोष्ठक उपज हैं int* A[n] ही नहीं बदलेगा।

Are array pointers? 

सं सरणी एक आंकड़ा संरचना है कि स्मृति पूल और दुकानों स्मृति पूल में एक विशेष सूचकांक के सूचक अंक और संदर्भ के रूप में डेटा है कि स्मृति स्थान पर संग्रहीत जहां डाटा को अनुक्रम आवंटित करता है।

+0

तकनीकी रूप से speking, arrays * * सी में 0 पॉइंटर्स हैं। – Shark

+14

@ शार्क नहीं, सरणी * क्षय हो सकती है * पॉइंटर्स को उनके पहले तत्व पर, लेकिन एक सरणी स्वयं सूचक नहीं है। –

+4

@ शार्क 'sizeof' अलग होना शुरू होगा। – juanchopanza

2

यह लेख http://www.unixwiz.net/techtips/reading-cdecl.html

मूल रूप से सी में पढ़ने प्रकार घोषणाओं में अच्छा उदाहरण दिए गए हैं, तो आपको निम्न पूर्वता के अनुसार अलग-अलग प्रकार पढ़ सकते हैं:

  1. (अक्सर parenthesized) भीतरी सबसे प्रकार

  2. राइट-अधिकांश प्रकार (ज्यादातर सरणी प्रकार: [])

  3. वाम अधिकांश प्रकार बाहरी सबसे एक को छोड़कर (अधिकतर सूचक प्रकार: *)

  4. बाहरी-अधिकांश प्रकार (ज्यादातर आदिम प्रकार: int, चार ..)

उदाहरण के लिए, आपके द्वारा प्रस्तुत किए गए प्रकारों को निम्नानुसार पढ़ा जा सकता है:

int* A[n]; // An array ([n]) of pointer (*) of int. 
int (*A)[n]; // A pointer (*) of array ([n]) of int. 
int *(A[n]); // An array ([n]) of pointer (*) of int. 

तो मूल रूप से, पहला और तीसरा प्रकार समान है।

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