2013-05-25 8 views
10

मैंने देखा है कि फ़ंक्शन पैरामीटर "int arr []" या "int * arr" है, तो सरणी मान बदल जाएंगे। अंतर कहाँ है?फ़ंक्शन पैरामीटर में int * array और int array [] के बीच अंतर

पूर्णांक सरणी []:

void myFunction(int arr[], int size) { 

    for (int i = 0; i < size; ++i) 
     arr[i] = 1; 
} 

पूर्णांक * सरणी:

void myFunction(int * arr, int size) { 

    for (int i = 0; i < size; ++i) 
     arr[i] = 1; 
} 

दोनों कार्यों सरणी मूल्यों को बदल।

int main(){ 

    int array[3]; 

    array[0] = 0; 
    array[1] = 0; 
    array[2] = 0; 

    myFunction(array, 3); 

    return 0; 

} 
+1

इस http://stackoverflow.com/questions/5491789/any-difference-between-fooint-arr-and-fooint-arr – Rohan

+6

कोई फर्क नहीं पड़ता है। बिलकुल। _ फ़ंक्शन पैरामीटर list_ में, 'int arr [] '' int * arr' के लिए "वैकल्पिक" लेखन के अलावा कुछ भी नहीं है। (और यही कारण है कि आप 'int main (int argc, char * argv [])' या 'int main (int argc, char ** argv)' देख सकते हैं।) भले ही आप ब्रैकेट के अंदर कोई संख्या डालें !: 'शून्य एफ में (int [10])' 10' पूरी तरह से ** अनदेखा ** है, जिसका अर्थ है 'शून्य एफ (int a [])' यानी 'शून्य एफ (int * ए)'। –

+0

और जैसा कि उत्तर में कहा गया है, कॉल 'myFunction (सरणी, 3);' आपकी सरणी को इसके पहले तत्व में _pointer_ में रूपांतरित कर दिया गया है, और वह सूचक फ़ंक्शन (पैरामीटर के लेखन के साथ) के रूप में पास किया जाता है, जैसा कि अगर आपने 'मेरा कार्य (& (सरणी [0]) कहा था, 3); '। वास्तव में सरणी को पार करने का एक तरीका (वास्तव में, इसे _reference_) एक फ़ंक्शन लिखना है जैसे 'टेम्पलेट शून्य जी (int (& arr) [size])', जो आपको इसे इस तरह से कॉल करने देता है: 'g (array) ; '। –

उत्तर

4

करना कोई अंतर है। दोनों फ़ंक्शन प्रकार (समायोजन के बाद) "int और int पर पॉइंटर लेते हुए कार्य करते हैं, void लौटाते हैं।" यह सी ++ का सिंटैक्टिक क्विर्क है: गैर-संदर्भ प्रकार के फ़ंक्शन पैरामीटर में बाहरीतम []* के समानार्थी है।

0

एक ही चीज़ को व्यक्त करने के विभिन्न तरीके। आप बस सूचक द्वारा कार्यों के लिए एक सरणी पारित कर रहे हैं।

-2

जब आप कार्यों के लिए एक सरणी पास करते हैं तो यह निश्चित रूप से पॉइंटर द्वारा इसे पास करता है। क्योंकि यदि मूल्य प्रतिलिपि द्वारा सरणी पास में कई तत्व हैं तो यह एक विशाल ओवरहेड है। भले ही यह अलग दिखता है।

आप एक ही समय में दोनों कार्यों का उपयोग नहीं कर सकते हैं। यदि आप अपने संकलन समय त्रुटि

error: redefinition of 'void myFunction(int*, int)' 
it is already defined. 
+0

मुझे पता है, मुझे पता है, यह सिर्फ एक उदाहरण ^^ सेट करने के लिए था। – Alex

+0

आपके द्वारा बताए जाने का कारण केवल अटकलें है। – EJP

-3

कोई फर्क नहीं पड़ता। वास्तव में, एक सरणी की घोषणा एक पॉइंटर allawys वापसी। केवल, जब आप घोषणा में निर्दिष्ट करते हैं कि चर एक सरणी है (यानी [] के साथ), यह निर्दिष्ट करना आवश्यक नहीं है कि यह एक सूचक होगा, क्योंकि यह पूरी तरह से बनाया गया है। लेकिन जब आप इसे निर्दिष्ट नहीं करते हैं, तो आपको इसे पॉइंटर के रूप में घोषित करना होगा यदि आप इसे तालिका चर को प्रभावित करते हैं, या "नया []" परिणाम देते हैं। तालिका के पॉइंटर्स के उपयोग में केवल गतिशील आवंटन के लिए रुचि होती है, जब सरणी आकार डिज़ाइन-टाइम पर ज्ञात नहीं होता है।

+0

यह सच नहीं है। "एक सरणी की घोषणा एक पॉइंटर को वापस लौटाती है" सादा गलत है। 'Int' में 'a' का प्रकार '[10];' int * ए में 'a' के प्रकार से * बहुत अलग * है। – Angew

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