2012-10-29 22 views
5

हम एक C/C++ समारोह शीर्षक में एक चर के रूप में एक सरणी पारित कर सकते हैं, के रूप मेंC/C++ समारोह शीर्षक में सरणी चर

int func(int arr[]) { ... } 

में मैं सोच रहा हूँ: यह कभी संभव है कि कुछ अंदर चला जाता है [] एक वेरिएबल में जो फंक्शन हेडर में पास हो गया है, या यह हमेशा खाली है?

+1

यह कोई फर्क नहीं पड़ता है जब तक कि आप किसी संदर्भ, पॉइंटर से सरणी या बहुआयामी सरणी का उपयोग न करें। – chris

+0

यह सी और सी ++ के लिए अलग है। सी वीएलए है। सी ++ टेम्पलेट्स है। –

+1

* "हम एक सी/सी ++ फंक्शन हेडर में चर के रूप में एक सरणी पास कर सकते हैं, जैसा कि *" - नहीं। आपके उदाहरण में फ़ंक्शन को पहले तत्व में पॉइंटर मिलता है, न कि सरणी। यह अपने आप का प्रयास करें; 'sizeof arr == sizeof int *', हमेशा। –

उत्तर

10

किसी भी (गैर संदर्भ) टाइप T के लिए, समारोह हस्ताक्षर R foo(T t[]) और R foo(T t[123]) (या किसी अन्य संख्या) R foo(T * t) के समान हैं, और सरणियों पहले के पते के पारित करके पारित कर रहे हैं तत्व।

ध्यान दें कि T स्वयं एक सरणी प्रकार हो सकता है, जैसे T = U[10]

+1

+1। मैंने कभी ऐसा नहीं सुना है, लेकिन यह अच्छा है। – chris

2
एक आयामी सरणी के लिए

, यह हमेशा खाली हो जाएगा, कोष्ठक लेखन का एक और तरीका है:

int fun(int * arr) 
{ 

} 

एक दो आयामी सरणी के लिए के रूप में, आप कैसे कई तत्वों प्रत्येक तत्व ही निर्दिष्ट करने की आवश्यकता रखती है

int fun(int arr[][3]) 
{ 

} 
+2

इसमें ब्रैकेट के बीच एक संख्या हो सकती है, भले ही यह एक आयामी हो, संकलक बस इसे अनदेखा करता है। अमूर्तता के लिए – imreal

2

int func (int arr []) {...} किसी फ़ंक्शन को पास की गई सरणी की एक अवैध घोषणा है।

एक सरणी नाम एक सूचक चर है। इसलिए यह पर्याप्त है कि हम केवल सरणी नाम (जो स्वयं एक सूचक है)

int func (int * arr) {...} सरणी के प्रारंभिक पते को फ़ंक्शन में पास कर देगा ताकि यह कर सके सरणी का प्रयोग करें।

यदि मूल सरणी को बरकरार रखने की आवश्यकता है, तो सरणी की एक प्रति को & फ़ंक्शन के भीतर उपयोग किया जा सकता है।

+0

सच नहीं है। यह वैध कोड है। – Acorbe

0

नाम एक सरणी के अधिकांश संदर्भों में एक सूचक अपनी पहली तत्व को में decays। तो जब आप लिखना

void f(int arr[]); 
void g(int arr[42]); 

नाम arr एक सूचक int करने में decays। दो घोषणाओं इन के बराबर हैं:

void f(int *arr); 
void g(int *arr); 

दो स्थानों पर जहां नाम क्षय नहीं होता है एक सरणी की परिभाषा में और sizeof लिए एक तर्क के रूप में हैं। तो वैश्विक क्षेत्र में इस घोषणा int करने के लिए एक सूचक को परिभाषित नहीं करता:

int arr[]; 

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

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