2012-09-24 13 views
5

जैसा ही है, क्या निम्न 2 फ़ंक्शन अनिवार्य रूप से एक ही कार्य हैं?एक int * पैरामीटर बिल्कुल int [] पैरामीटर

यानी int* बिल्कुल int[] जैसा ही है?

int myFunction(int* xVals, int* yVals, int nVertices); 
int myFunction(int xVals[], int yVals[], int nVertices); 

मैं 1 समारोह का उपयोग कर सकते कैसे? हां, मैं पैरामीटर में सरणी कैसे पास कर सकता हूं? क्या निम्नलिखित वैध/सही है?

int xVals[5], yVals[5], zVals[5]; 
myFunction(xVals, yVals, zVals, 5); 

// or should it be.. 
myFunction(&xVals[0], &yVals[0], &zVals[0], 5); 
+4

क्या आप वाकई 'int xVals []' का मतलब नहीं रखते हैं? – cnicutar

+0

@cnicutar yes sry यह होना चाहिए कि –

+0

कोई समस्या नहीं है, अब मैं आपको संदर्भित कर सकता हूं [लेकिन मैंने सुना है कि char 'a []' char '* a'] के समान था (http://c-faq.com/ aryptr/aryptr2.html) – cnicutar

उत्तर

8

एक समारोह पैरामीटर सूची में, तो समारोह घोषणाओं के बराबर हैं:

int myFunction(int* xVals, int* yVals, int nVertices); 
int myFunction(int xVals[], int yVals[], int nVertices); 

बहरहाल, यह आसानी से सामान्य नहीं है। एक समारोह के अंदर, वहाँ के बीच एक बड़ा अंतर है:

int arrays_vs_pointers(int **iptrptr, int array[][12]); 

आप यह भी चाहते हैं के बारे में (सही):

int AnotherFunction(void) 
{ 
    int array[] = { 0, 1, 2, 3 }; 
    int *iptr = &array[0]; 
    ... 
} 

और एक समारोह इंटरफ़ेस में, वहाँ दो पैरामीटर प्रकार के बीच एक बड़ा अंतर है

int xVals[5], yVals[5]; 
myFunction(xVals, yVals, 5); 

// or should it be.. 
myFunction(&xVals[0], &yVals[0], 5); 

ये कॉल दोनों मान्य हैं और एक दूसरे के बराबर हैं।


अपने मूल शीर्षक सवाल का जवाब 'एक int * एक int [] के रूप में बिल्कुल वैसा ही है? 'नहीं है।

ऐसी परिस्थितियों की एक सीमित संख्या है जिसके अंतर्गत वे बराबर हैं, लेकिन कई और परिस्थितियां हैं जहां वे बहुत अलग हैं।

आपके संशोधित शीर्षक प्रश्न का उत्तर 'int * पैरामीटर बिल्कुल int [] पैरामीटर जैसा ही है? 'हां है!

2

शीर्षक में सवाल वास्तविक पोस्ट शरीर में सवाल से अलग है ...

सामान्य में, यह सच नहीं है कि संकेत दिए गए, सरणियों के रूप में ही कर रहे हैं में तो बहुत सारे मामले, int []int * जैसा नहीं है।

हालांकि, एक समारोह घोषणा (या परिभाषा), जब एक एक आयाम सरणी तर्क के रूप में पारित हो जाता है, यह एक सूचक में decays, तो इस कारण, पहले मामले के विपरीत,

int myFunction(int *xVals, int *yVals, int nVertices); 

और

int myFunction(int xVals[], int yVals[], int nVertices); 

बराबर हैं।

1

पिछले उत्तरों सही हैं।

int myFunction(int* xVals, int* yVals, int nVertices); 

myFunction(xVals, yVals, zVals, 5); 

myfunction 3 मानकों की उम्मीद है, लेकिन आप अपने कॉल में 4 गुजर रहे हैं: यह सिर्फ जोड़ने के लिए आप अपने घोषणा और अपने कॉल के बीच एक बेमेल पैरामीटर गिनती होता है।

0

कुछ रोचक (? उपयोगी) इस तरह के पैरामीटर विनिर्देशों के आसपास अंक:

  • यदि आप एक 1-आयामी सरणी पैरामीटर के लिए एक आयाम निर्दिष्ट करने पर, फोन करने वाले के द्वारा उपलब्ध कराया तर्क के खिलाफ किसी भी तरह से जाँच नहीं की है, उदाहरण के लिए: f(int x[5])int x[] = { 1, 2}; f(x); या यहाँ तक कि int x; f(&x);

  • आला कहा जा सकता है कि यदि आप एक पैरामीटर के लिए एक संदर्भ स्वीकार करते हैं, तो आयाम की जाँच की और, से मेल खाना चाहिए, उदाहरण के लिए कर रहे हैं: f(int (&x)[5]) केवल किया जा सकता है एक तर्क ठीक 5 तत्वों (या कुछ है कि प्रकार के लिए डाली) के साथ एक पूर्णांक सरणी है कि के साथ कहा जाता है

  • टेम्पलेट्स मापदंडों का संकलक प्रसिद्ध आयाम कब्जा करने के लिए, के रूप में इस्तेमाल किया जा सकता: इन पिछले के लिए template <size_t N> void f(int (&x)[N]) { ...can use N in here... }

  • दो बाय-रेफरेंस पैरामीटर, आप किसी पुराने पॉइंटर-टू -int में पास नहीं कर सकते हैं ... यदि सूचक वास्तव में एक उपयुक्त सरणी के लिए है तो आपको इसे पहले टाइप करना होगा

  • कि संकलन पर उप-संदर्भ पैरामीटर चेक किए गए हैं समय-समय पर सुझाव दिया जाता है कि उन्हें पसंद किया जाना चाहिए जब तर्कों की संख्या संकलन समय पर ज्ञात है ... अभ्यास में एक स्मीज उससे अधिक जटिल हो सकता है, उदाहरण के लिए void f(int[]); घोषित करने वाला हेडर प्रदान करने वाली लाइब्रेरी अभी भी कार्यान्वयन में भिन्न हो सकती है और एक अलग लाइब्रेरी ऑब्जेक्ट को एक अलग आकार के सरणी के प्रोसेसिंग का समर्थन कर सकती है (जिसे इसे किसी अन्य तर्क या सेंटीनेल के आधार पर पहचानने की आवश्यकता होगी संयोजक) बिना किसी हेडर परिवर्तन के क्लाइंट रीकंपिलेशन (अधिकांश बिल्ड सिस्टम में) की आवश्यकता या ट्रिगर करना