2009-11-24 16 views
25

आप एक सी लिखते हैं ++ तरहअंतर और * तारांकन

 
void readEmStar(int *arrayOfInt) 
{ 
} 

एक सी ++ की तरह समारोह बनाम समारोह:

 
void readEmSquare(int arrayOfInt[]) 
{ 
} 

क्या [वर्ग कोष्ठक] का उपयोग कर बनाम के बीच अंतर है * तारांकन, और क्या किसी के पास स्टाइल गाइड है जिसके लिए प्राथमिकता है, मानते हैं कि वे कंपाइलर के बराबर हैं?

पूर्णता के लिए, एक उदाहरण

void readEmStar(int *arrayOfInt, int len) 
{ 
    for(int i = 0 ; i < len; i++) 
    printf("%d ", arrayOfInt[i]) ; 
    puts(""); 
} 


void readEmSquare(int arrayOfInt[], int len) 
{ 
    for(int i = 0 ; i < len; i++) 
    printf("%d ", arrayOfInt[i]) ; 
    puts(""); 
} 

int main() 
{ 
    int r[] = { 2, 5, 8, 0, 22, 5 } ; 

    readEmStar(r, 6) ; 
    readEmSquare(r, 6) ; 
} 

उत्तर

56

आप प्रकार char *xके बजाय char x[] प्रारंभ बिना उपयोग करते हैं, आप उन्हें एक ही विचार कर सकते हैं। आप प्रारंभ के बिना char x[] के रूप में एक नया प्रकार घोषित नहीं कर सकते हैं, लेकिन आप उन्हें कार्यों के पैरामीटर के रूप में स्वीकार कर सकते हैं। इस मामले में वे पॉइंटर्स के समान हैं।

आप प्रकार char x[]char *x प्रारंभ साथ के बजाय का उपयोग करते हैं, वे पूरी तरह से 100% अलग हैं।


कैसे char x[]char *x से अलग है का उदाहरण:

char sz[] = "hello"; 
char *p = "hello"; 

sz वास्तव में एक सरणी, नहीं सूचक है।

assert(sizeof(sz) == 6); 
assert(sizeof(sz) != sizeof(char*)); 
assert(sizeof(p) == sizeof(char*)); 

कैसे char x[] ही char *x के रूप में है का उदाहरण:

void test1(char *p) 
{ 
    assert(sizeof(p) == sizeof(char*)); 
} 

void test2(char p[]) 
{ 
    assert(sizeof(p) == sizeof(char*)); 
} 

कार्यों के लिए पारित करने के लिए शैली कोडन:

यह वास्तव में doe कोई फर्क नहीं पड़ता कि आप कौन सा करते हैं। कुछ लोग char x[] पसंद करते हैं क्योंकि यह स्पष्ट है कि आप एक सरणी पारित करना चाहते हैं, न कि एक तत्व का पता।

आमतौर पर यह पहले से ही स्पष्ट है क्योंकि आपके पास सरणी की लंबाई के लिए एक और पैरामीटर होगा।


अतिरिक्त पठन:

कृपया इस पोस्ट Arrays are not the same as pointers!

+0

चूंकि सरणी और पॉइंटर्स सी ++ में काफी समान हैं, इसलिए आप फ्लाईएम स्क्वायर में – tloach

+0

पर थोड़ा सा जोड़ सकते हैं, चेकिंग आकार (arrayOfInt) 4 लौटाएगा, यह एक सूचक – bobobobo

+0

है जब आप शुरुआत के बिना char [] का उपयोग करते हैं तो मेरे नोट देखें। –

3

हकदार देख वहाँ अलग अलग शैली स्पष्ट रूप से से, अपने दो कोड के बीच कोई अंतर नहीं है। दोनों स्थितियों में सरणी संदर्भ द्वारा पारित की जाती है और मूल्य से नहीं, क्योंकि फ़ंक्शन पैरामीटर type *x और type x[] अर्थात् समान हैं।

+4

अर्थात् फ़ंक्शन पैरामीटर के समान ही। –

+0

संदर्भ द्वारा यहां एक सरणी पारित नहीं की गई है (हां, सी ++ में संदर्भ द्वारा सरणी पास करना भी संभव है)। इसके बजाय सरणी, जब किसी फ़ंक्शन पर जाती है, तो पहले तत्व को पॉइंटर करने का निर्णय होता है, जो मान द्वारा पारित किया जाता है। हालांकि, कोड के बीच कोई अंतर नहीं है। – UncleBens

-1

दो अभिव्यक्ति समकक्ष हैं।वे प्रत्येक सरणी arrayOfInt के पहले तत्व के पते पर मूल्यांकन करते हैं।

13

सी ++ स्टैंडर्ड 13.1.3

- पैरामीटर घोषणाओं है कि केवल एक सरणी [] बनाम एक सूचक * में अलग बराबर हैं। यही है, सरणी घोषणा सूचक घोषणा (8.3.5) बनने के लिए समायोजित की गई है। केवल दूसरा और बाद के सरणी आयाम पैरामीटर प्रकार (8.3.4) में महत्वपूर्ण हैं। [उदाहरण:

int f(char*); 
int f(char[]); // same as f(char*); 
int f(char[7]); // same as f(char*); 
int f(char[9]); // same as f(char*); 
int g(char(*)[10]); 
int g(char[5][10]); // same as g(char(*)[10]); 
int g(char[7][10]); // same as g(char(*)[10]); 
int g(char(*)[20]); // different from g(char(*)[10]); 

अंत उदाहरण]

+0

अच्छा उदाहरण! मैं इसके बारे में सोच रहा हूं .. इसलिए यदि आप इसे निर्दिष्ट करते हैं तो संकलक द्वारा संख्या को त्याग दिया जाता है, मूल रूप से, जब तक कि 2 डी या उससे अधिक नहीं, तब तक, केवल अंतिम संख्या ही रखी जाती है। – bobobobo

1

शैली सवाल मैं मेरी गर्दन बाहर छड़ी और कहते हैं कि पूर्णांक * arrayOfInt बेहतर है जाएगा पर। आप जिस भी वाक्यविन्यास का उपयोग करते हैं, वह एक सूचक पास कर रहे हैं और प्रकार को स्पष्ट करना चाहिए।

यह मेरी राय है।

+0

मैं अपनी गर्दन को छूंगा, और सहमत हूं :) –

+2

आपकी गर्दन दिखा रही है – bobobobo

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