2009-04-08 16 views
7

मैं कुछ कोड मैं निम्नलिखित चर घोषणा के साथ mantaining कर रहा हूँ मिल गया है:पासिंग सी सरणी

char tmpry[40]; 

यह इस समारोह के साथ प्रयोग किया जा रहा है:

char *SomeFunction(char *tmpryP) { 
    // Do stuff. 
} 

समारोह कॉल है:

SomeFunction(&tmpry[0]); 

मैं बहुत लानत सुनिश्चित करें कि सिर्फ एक ही है के रूप में कर रहा हूँ:

+०१२३५१६४१०६
SomeFunction(tmpry); 

मैंने यह भी जांच की है कि कुछ फ़ंक्शन में char * पॉइंटर दोनों मामलों में सरणी के समान स्मृति स्थान को इंगित करता है।

मेरा प्रश्न एक स्वच्छता जांच है कि क्या दो फ़ंक्शन कॉल समान हैं (और इसलिए मूल प्रोग्रामर केवल बुरा था)?

+0

मुझे लगता है कि यह SomeFunction को भी लंबाई पारित करने के लिए अच्छा होगा पर C Programming FAQ अनुभाग, बस मामले में ... :) –

+1

सरणी के पहले तत्व के पते के लिए वर्ण सरणी का नाम उपनाम है। – David

+0

हैलो, मैं उन "बुरा" प्रोग्रामर में से एक हूं जो इस तरह लिखते हैं। आम तौर पर, मैं इस समय उपयोग किए गए सरणी अमूर्तता को कम युग्मन के कारण सी ++ कोड में करता हूं। अर्थात। एक * अमूर्त * सरणी जैसी डेटा संरचना के लिए (जैसे 'std :: vector ') ओवरलोडेड' ऑपरेटर [] 'एक्सप्रेशन' x' और' & x [0] 'के साथ बहुत अलग चीजों का अर्थ होगा, और * दूसरा * एक वह है जो मेरे इरादे के लिए बेहतर फिट बैठता है। बेशक, यह सब सादा सी के लिए इतना मायने रखता नहीं है, क्योंकि आपको किसी भी तरह से सी में कोई डेटा अबास्ट्रक्शन नहीं मिलता है; इस प्रकार बेहतर पठनीयता के साथ वर्तनी को प्राथमिकता दी जानी चाहिए। – ulidtko

उत्तर

12

वे बिल्कुल वही हैं।

someArray[i] 

का मतलब बिल्कुल

*(someArray + i) 

जहां दूसरे मामले में someArray स्मृति स्थान के लिए सूचक है। इसी तरह,

&someArray[i] 

वास्तव में इसका मतलब है

(someArray + i) 

दोनों इन मामलों शर्तों स्मृति स्थल के लिए संकेत दिए गए हैं में।

12

दोनों बराबर हैं और मुझे लगता है कि कुछ समारोह (tmpry); अधिक पठनीय है।

1

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

+0

मैं सहमत हूं, आपको आकार के साथ ही सरणी पास करनी चाहिए। –

+0

एसडीडी :: स्ट्रिंग, या बूस्ट/tr1 :: सरणी का उपयोग करना बेहतर है। – GManNickG

+0

मैं सहमत हूं कि यह एक नया कोड है, लेकिन यदि कोड पहले ही लिखा गया है तो डेटास्ट्रक्चर को आसानी से बदलना संभव नहीं हो सकता है .. – Naveen

1

इन दो वेरिएंट बराबर है और इस तरह

SomeFunction(tmpry); 

क्लीनर लग रहा गुजर रहे हैं।

7

यह महत्वपूर्ण हो सकता है, अगर SomeFunction एक मैक्रो है और अपने तर्कों में से एक की "sizeof" लेता है, क्योंकि sizeof(tmpry) जरूरी sizeof(&tmpry[0]) के बराबर नहीं हो सकता है।

अन्यथा, जैसा कि अन्य ने बताया, वे बिल्कुल वही हैं।

+0

पास करें इस मामले में कोई मैक्रो शामिल नहीं है। हालांकि एक मैक्रो उन्हें अलग तरीके से कैसे व्यवहार करेगा? एक स्ट्रिंग खोज और प्रतिस्थापन की तरह एक मैक्रो काम नहीं करता है, इसलिए यह उत्पादित फ़ंक्शन सामान्य कार्य के बराबर होगा? – sipwiz

+0

मैक्रो आकार (मैक्रो तर्क) लेता है तो परिणाम अलग होंगे। –

+0

# मैक्रो (x) RealFunctionCall (x, sizeof (x)) // उदाहरण के लिए – dreamlax

3

जैसा कि सभी ने कहा, दोनों नोटेशन बराबर हैं।

मैं सामान्य रूप से, सरल एक का प्रयोग करेंगे जब तक कि वहाँ इस तरह कई कॉल कर रहे हैं:

SomeFunction(&tmparry[0]); 
SomeFunction(&tmparry[10]); 
SomeFunction(&tmparry[NNN]); 

enum कहाँ आदर्श सभी स्थिरांक (जादू संख्या) होगा (या #define) स्थिरांक।

+0

अच्छी तरह से, tmparry + 10 से बेहतर है और tmparray [10] – hasen

+1

मैं असहमत हूं - लेकिन यह एक व्यक्तिपरक निर्णय है। –

1

घोषणा

int [10]; int * pa;

एक सरणी और एक सूचक के बीच एक अंतर है जिसे ध्यान में रखा जाना चाहिए। एक सूचक एक चर है, इसलिए pa = a और pa ++ कानूनी हैं। लेकिन एक सरणी नाम एक चर नहीं है; एक = पा और एक ++ की तरह निर्माण अवैध

एक समारोह परिभाषा प्रारूप पैरामीटर के रूप में कर रहे हैं, चार रों [] और चार * रों बराबर हैं;

से:। The C Programming Language 2th, पेज 99-100

+0

पेज 99 से उद्धरण के लिए: "जब किसी एरे का नाम किसी फ़ंक्शन पर पास किया जाता है, तो प्रारंभिक तत्व का स्थान क्या होता है" – David

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