2012-05-25 10 views
6

बीच क्या अंतर है:सी ++ * बनाम [] एक समारोह पैरामीटर के रूप में

void foo(item* list) 
{ 
    cout << list[xxx].string; 
} 

और

void this(item list[]) 
{ 
    cout << list[xxx].string; 
} 

आइटम मानते हुए है:

struct item 
{ 
    char* string; 
} 
सूचक की ओर इशारा करते के साथ

वर्णों की एक सरणी के पहले

और list आइटमों की एक सरणी है ...

उत्तर

8

कंपाइलर के लिए, कोई अंतर नहीं है।

हालांकि यह अलग-अलग पढ़ता है। [] सुझाव देता है कि आप फ़ंक्शन में एक सरणी पास करना चाहते हैं, जबकि * का अर्थ केवल एक साधारण सूचक भी हो सकता है।

ध्यान दें कि मानदंड पैरामीटर के रूप में पारित होने पर पॉइंटर्स को क्षय हो जाता है (यदि आपको पहले से पता नहीं था)।

+0

+1 "ध्यान दें कि संकेत जब पैरामीटर के रूप में पारित कर दिया करने के लिए क्षय सरणियों" के लिए कर रहे हैं। मुझे यह नहीं पता था, जानना दिलचस्प है। – Drise

+0

केवल एरे अभिव्यक्ति को पॉइंटर्स के लिए क्षय नहीं करते हैं, जब आप एक फ़ंक्शन पैरामीटर के रूप में एक सरणी प्रकार निर्दिष्ट करते हैं, तो यह वास्तव में ओवरलोडिंग, 'आकार' और 'decltype' सहित सभी उद्देश्यों के लिए एक सूचक प्रकार में बदल जाता है। आप इसे एक तरह से घोषित भी कर सकते हैं और इसे एक अलग तरीके से परिभाषित कर सकते हैं (लेकिन आपको शायद नहीं करना चाहिए)। – aschepler

+1

मानक से पाठ को जोड़ना अच्छा होगा, ताकि किसी को यह इंप्रेशन देने से बचें कि सरणी और पॉइंटर्स सामान्य रूप से समान हैं। फ़ंक्शन पैरामीटर केवल एक विशेष मामला है जहां मानक राज्य "प्रत्येक पैरामीटर के प्रकार को निर्धारित करने के बाद," टी के सरणी "प्रकार के किसी भी पैरामीटर को [...]" टी को पॉइंटर "के रूप में समायोजित किया जाता है [...]।" [dcl.fct] 8.3.5/5। – bames53

3

वे वही हैं - पूरी तरह समानार्थी। और दूसरा item list[] है, item[]list नहीं।

हालांकि [] का उपयोग करने के लिए यह प्रथागत है जब पैरामीटर को एक सरणी और * का उपयोग किया जाता है जब इसे पॉइंटर की तरह उपयोग किया जाता है।

1
FYI करें

:

void foo(int (&a)[5]) // only arrays of 5 int's are allowed 
{ 
} 

int main() 
{ 
    int arr[5]; 
    foo(arr); // OK 

    int arr6[6]; 
    foo(arr6); // compile error 
} 

लेकिन foo(int* arr), foo(int arr[]) और foo(int arr[100]) सब बराबर

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

  • कोई संबंधित समस्या नहीं^_^