2010-05-30 11 views
12

संभावित डुप्लिकेट:
What is the difference between char s[] and char *s in C?char a [] = "string" के बीच अंतर; चार * पी = "स्ट्रिंग";

char a[]="string"; और char *p="string"; के बीच क्या अंतर है?

+3

क्या आप इस सवाल को छोटा कर सकते हैं? – liori

+2

यह एक डुप्लिकेट –

+1

@ लिओरी है: char a [] = "s"; ! = char * पी = "एस"; ? :) – PeterM

उत्तर

2

पहली घोषणा एक सरणी घोषित करती है, जबकि दूसरी - एक सूचक।

यदि आप किसी विशेष पहलू में अंतर में रूचि रखते हैं, तो कृपया अपने प्रश्न को स्पष्ट करें।

9

char a[]="string"; // a वर्णों की एक श्रृंखला है।

char *p="string"; // p स्थिर आवंटन वाला एक स्ट्रिंग अक्षर है। p की सामग्री को संशोधित करने का कोई भी प्रयास अपरिभाषित व्यवहार की ओर जाता है क्योंकि स्ट्रिंग अक्षर को स्मृति के केवल-पढ़ने वाले अनुभाग में संग्रहीत किया जाता है।

2

कोई फर्क नहीं पड़ता। जब तक आप वास्तव में सरणी को लिखना नहीं चाहते हैं, तो यदि आप दूसरे रूप का उपयोग करने का प्रयास करते हैं तो पूरी दुनिया में विस्फोट हो जाएगा। here देखें।

27

पहला वाला सरणी दूसरा सूचक है।

सरणी घोषणा "char a[6];" अनुरोध करता है कि छह वर्ण के लिए जगह अलग होना निर्धारित, नाम से जाना जाता है "a." यही है, वहाँ "a" नामक एक स्थान है, जिस पर छह वर्ण बैठ सकते है। दूसरी तरफ पॉइंटर घोषणा "char *p;", एक पॉइंटर रखने वाले स्थान का अनुरोध करती है। सूचक को "p," नाम से जाना जाता है और कहीं भी किसी भी चार (या वर्णों की संगत सरणी) को इंगित कर सकता है।

बयान

char a[] = "hello"; 
char *p = "world"; 

जो इस तरह निरूपित किया जा सकता डेटा संरचनाओं में परिणाम होगा:

+---+---+---+---+---+---+ 
a: | h | e | l | l | o |\0 | 
    +---+---+---+---+---+---+ 
    +-----+  +---+---+---+---+---+---+ 
p: | *======> | w | o | r | l | d |\0 | 
    +-----+  +---+---+---+---+---+---+ 

यह एहसास है कि एक्स की तरह एक संदर्भ [3] के आधार पर अलग कोड उत्पन्न महत्वपूर्ण है चाहे एक्स एक सरणी या सूचक है। उपर्युक्त घोषणाओं को देखते हुए, जब संकलक अभिव्यक्ति को [3] देखता है, तो यह "ए" स्थान पर शुरू करने के लिए कोड को छोड़ देता है, इसके पीछे तीन स्थानांतरित होता है, और वहां चरित्र लाता है। जब यह अभिव्यक्ति पी [3] देखता है, तो यह "पी" स्थान पर शुरू करने के लिए कोड को उत्सर्जित करता है, वहां पॉइंटर मान लाता है, पॉइंटर में तीन जोड़ता है, और आखिरकार चरित्र को इंगित करता है। उपर्युक्त उदाहरण में, एक [3] और पी [3] दोनों वर्ण 'एल' होते हैं, लेकिन संकलक अलग-अलग होते हैं।

आप खोज का उपयोग कर सकते हैं इंटरनेट पर विषय पर कई स्पष्टीकरण हैं।

+4

पहले मामले में आवंटित स्मृति कहां है और दूसरे मामले में कहां है? ढेर? ढेर? जब आप किसी और को पी को इंगित करने का निर्णय लेते हैं तो इसका मतलब यह है कि "wrold" को हटा दिया जाएगा? ASCII कलाकृति के लिए – Laz

+6

+1। –

+3

@ राम भट: पहले मामले में, यह इस परिभाषा पर निर्भर करता है कि यह परिभाषा कहां स्थित है; यदि यह एक समारोह में है, शायद ढेर पर, यदि यह एक संरचना में है, तो यह इस बात पर निर्भर करता है कि पूरी संरचना आवंटित की जाती है; यदि यह वैश्विक वर्र्स सेगमेंट में किसी भी फ़ंक्शन के बाहर है। पॉइंटर पी के लिए वही है; "दुनिया" स्ट्रिंग जिसके लिए पी पॉइंट्स, इसके बजाय, * आमतौर पर * निष्पादन योग्य के एक विशेष खंड में होता है जिसे लोडिंग पर स्मृति में मैप किया जाता है, जिसे स्ट्रिंग टेबल के रूप में उपयोग किया जाता है। –

1

एक अंतर यह है कि आकार (ए) -1 संकलन समय पर स्ट्रिंग की लंबाई के साथ प्रतिस्थापित किया जाएगा। पी के साथ आपको रनटाइम पर लंबाई प्राप्त करने के लिए स्ट्रेल (पी) का उपयोग करने की आवश्यकता है। इसके अलावा कुछ कंपाइलर्स को char * p = "string" पसंद नहीं है, वे const const char * p = "string" चाहते हैं, जिस स्थिति में "स्ट्रिंग" के लिए स्मृति केवल पढ़ने के लिए है, लेकिन स्मृति के लिए स्मृति नहीं है। भले ही कंपाइलर को स्थिर घोषणा की आवश्यकता न हो, भले ही पी (यानी * पी = 'ए') द्वारा इंगित स्ट्रिंग को संशोधित करने के लिए यह खराब अभ्यास है। पॉइंटर पी को किसी और चीज पर इंगित करने के लिए बदला जा सकता है। सरणी के साथ, सरणी में एक नया मान कॉपी किया जाना चाहिए (यदि यह फिट बैठता है)।

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