2013-06-09 6 views
13

मैंने कोड का एक टुकड़ा पढ़ा और पाया कि ऐसा कोई फ़ंक्शन है।फ़ंक्शन "int (* फ़ंक्शन()) [10];" क्या मतलब है?

int (*function())[10]{ 
... 
} 

मैं उलझन में हूं। इस समारोह का क्या अर्थ है और यह क्या लौटाएगा?

+13

http://cdecl.org और http://c-faq.com/decl/ spiral.anderson.html – chris

+0

फ़ंक्शन पॉइंटर्स जैसे http://www.cprogramming.com/tutorial/function-pointers.html – user1929959

+3

@ user1929959 के बारे में कुछ ट्यूटोरियल भी देखें: लेकिन फ़ंक्शन पॉइंटर्स के पास प्रश्न में कुछ भी करने के लिए कुछ भी नहीं है ? –

उत्तर

16

यह एक फ़ंक्शन की परिभाषा है जो 10 पूर्णांक की सरणी में पॉइंटर लौटाती है।

याद रखें कि वापसी मूल्य सूचक है, वास्तविक सरणी नहीं। Arrays कार्यों से वापस नहीं किया जा सकता है। प्रति पैरा 8.3.5/8 स्टैंडर्ड की:

कार्य प्रकार सरणी या समारोह की वापसी प्रकार नहीं होगा, हालांकि वे ऐसी बातें

के प्रकार सूचक या संदर्भ का एक वापसी प्रकार हो सकता है

int arr[10];  // an array of 10 int 
int (*ptr)[10]; // pointer to an array of 10 int 

int (*function())[10] // function returning a pointer to an array of 10 int 
{ 
    return ptr; 
} 

int main() 
{ 
    int (*p)[10] = function(); // assign to the pointer 
} 

आप इस का उपयोग कर सकते हैं भी आप सामान्य रूप से एक सूचक का प्रयोग करेंगे:

यहाँ कैसे आप इसका इस्तेमाल होता है का एक सरल उदाहरण है। लेकिन ध्यान दें कि पॉइंटर्स की तुलना में बेहतर विकल्प हैं, जैसे std::shared_ptr<std::array<T, N>> या std::shared_ptr<std::vector<T>>

+0

क्या यह भी उपयोगी है? : - | मेरा मतलब जवाब नहीं है, मेरा मतलब यह है कि वापसी मूल्य आकार 10 की एक सरणी के लिए एक सूचक है। –

+0

@ निकोससी।, मैं एक 'std :: array ' वापस कर दूंगा, या यदि आप वास्तव में इसे उचित रूप से बदल देंगे मूल को बदलने की जरूरत है। – chris

+1

@ निकोससी। हां, हम किसी अन्य ऑब्जेक्ट की तरह पॉइंटर लौट रहे हैं। एक और फायदा यह है कि यह केवल तभी संकलित होगा यदि सरणी आकार 10 है, कोई प्रकार का क्षय शामिल नहीं है। – 0x499602D2

8

जिस तरह से यह सबसे बाईं ओर के पहचानकर्ता खोजने के लिए और अपने रास्ते से काम करते हैं, याद है कि * से पहले () और [] बाँध, इसलिए *a[] संकेत की एक सरणी है करने के लिए है पढ़ने के लिए, (*a)[] एक सरणी के लिए सूचक है, *f() एक समारोह है एक सूचक वापस लौटना, और (*f)() एक समारोह के लिए एक सूचक है। इस प्रकार,

 function   - function 
     function()  - is a function 
    *function()  - returning a pointer 
    (*function())[10] - to a 10-element array 
int (*function())[10] - of int 
+1

कभी भी सरणी लौटने वाले फ़ंक्शंस में नहीं आया (या पहले एरे के पॉइंटर्स); दाईं ओर '[]' अजीब लग रहा है। मुझे लगता है कि जटिलता में अगला कदम इस समारोह में एक सूचक घोषित करेगा। –

+0

इसे देखने का दूसरा तरीका 'फंक्शन() 'को प्रतीक' एफ 'के साथ प्रतिस्थापित करना है,' int (* f) [10]' देना; अब यह बहुत अजीब नहीं लग रहा है। –

+0

बेशक, यह सही तर्क समझ वाक्यविन्यास के अनुसार बनाता है; यह सिर्फ इतना है कि आप इस मामले में आने के बिना वर्षों तक कोड कर सकते हैं, यह मुझे ऑफ-गार्ड पकड़ा ... मुझे लगता है कि आप हर दिन कुछ सीखते हैं;) –

0

यह है इसका मतलब है कि एक समारोह सूचक और तर्क शून्य है और बदले पूर्णांक [10]

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