सी घोषणाएं अभिव्यक्ति के प्रकारों के आसपास आधारित हैं, वस्तुओं नहीं।
आप एक int
pi
नामित करने के लिए एक सूचक है, और आप पूर्णांक मान है कि यह की ओर इशारा उपयोग करना चाहते हैं, तो आप संकेतक भिन्नता है, के रूप में:
x = *pi;
printf("%d", *pi);
*pi = 1 + 2;
आदिअभिव्यक्ति*pi
के प्रकार int
है: इसलिए, घोषणा के रूप में
int *pi;
अब पढ़ना चाहिए मान लें कि आप char
की ओर इशारा की एक सरणी था करते हैं; किसी भी चरित्र को पाने के लिए, आप सरणी में पहले सबस्क्रिप्ट की जरूरत है, तो परिणाम भिन्नता:
c = *pc[i];
if (*pc[j] == 'a') {...}
आदि फिर, अभिव्यक्ति*pc[i]
char
है के प्रकार, इसलिए घोषणा पढ़ता
के रूप में
char *pc[N];
*pi
और *pc[N]
दोनों declarators रूप में जाना जाता है, और प्रकार निर्दिष्टकर्ता द्वारा दिए गए नहीं अतिरिक्त प्रकार की जानकारी को निर्दिष्ट कर रहे हैं। IOW, pc
के सरणी-नेस और पॉइंटर-नेस को घोषणाकर्ता के हिस्से के रूप में निर्दिष्ट किया गया है, जबकि char
-प्रकार प्रकार विनिर्देशक द्वारा दिया जाता है।
सवाल जिनमें से है शैली उचित है के रूप में ...
न तो एक है "सही" है, लेकिन मैं (और कई अन्य C प्रोग्रामर) के रूप में करने का विरोध किया T* p
T *p
लिखने के लिए पसंद करते हैं, यह बाद से भाषा व्याकरण को अधिक बारीकी से प्रतिबिंबित करता है (*
घोषणाकर्ता का हिस्सा है) और यह एकाधिक वस्तुओं की घोषणा करते समय भ्रम से बचने में मदद करता है। मैंने कोT* a, b;
लिखने वाले लोगों के बहुत से उदाहरण देखे हैं और b
को पॉइंटर होने की उम्मीद है।
उस आलोचना की सामान्य प्रतिक्रिया "प्रति पंक्ति एक से अधिक आइटम घोषित न करें"। उस प्रतिक्रिया का मेरा जवाब है "अपने घोषणाकर्ताओं को सही ढंग से लिखें और आपको कोई समस्या नहीं होगी"।
कई सी ++ प्रोग्रामर, जो T* p
शैली पसंद करते हैं के बीच में सोचा था की एक अलग स्कूल नहीं है, और मैं कुछ मामलों में जहां यह कोड अधिक पठनीय बना सकते हैं (सी ++ तक सीमित) देखते हैं कहना है।
हालांकि, कि केवल T
करने के लिए सरल संकेत के लिए काम करता है: प्रतिमान तेजी से टूट जाती है जब आप काम करता है, आदि की ओर इशारा की सरणियों की ओर इशारा की सरणियों, या सरणियों की ओर इशारा, या कार्यों के लिए संकेत दिए गए, या संकेत के साथ काम शुरू मेरा मतलब है,
T* (*(*p)[N])(); // p is a pointer to an array of pointers to functions
// returning pointers to T.
जैसे कुछ लिखना सिर्फ भ्रमित सोच को इंगित करता है।
संपादित
के पुन: प्रयास करें:
हालांकि, अगर आप
वास्तव में वास्तव में बहुत लगता है कि आप
T* p
प्रतिमान का पालन करना होगा, तो आप हमेशा typedefs की एक श्रृंखला बना सकते हैं
typedef T* TPtr; // pointer to T
typedef TPtr TPtrFunc(); // function returning pointer to T
typedef TPtrFunc* TPtrFuncPtr; // pointer to function returning
// pointer to T
typedef TPtrFuncPtr TPtrFuncPtrArray[N]; // N-element array of pointer to function
// returning pointer to T
TPtrFuncPtrArray* p;
भगवान के प्यार के लिए, ऐसा मत करो।
मुझे नहीं पता कि लोग इसे बंद करने के लिए क्यों मतदान कर रहे हैं।यह मेरे लिए एक वैध सवाल की तरह लगता है, लेकिन फिर मैं केवल 1 9 80 से हैकिंग सी रहा हूं। –
@ पीटररवेल: इस तरह के मामूली सवाल के साथ एकमात्र समस्या यह है कि कोई भी Google या किसी अन्य खोज के साथ इसका उत्तर ऑनलाइन प्राप्त कर सकता है सेकंड के मामले में इंजन। और सी पर किसी भी सभ्य पुस्तक को भी यह समझा जाना चाहिए। उनका उपयोग क्यों नहीं करें? हालांकि, मैंने इसे बंद करने के लिए वोट नहीं दिया था। –
संभावित डुप्लिकेट [क्या इससे कोई फर्क पड़ता है कि सी ++ में पॉइंटर्स घोषित करते समय मैं तारांकन कहां रखता हूं?] (Http://stackoverflow.com/questions/5449908/does-it-matter-where-i-place-the-asterisk-when -declaring-pointers-in-c) –