2012-03-12 27 views
5

सी ++ में करने के लिए एक सूचक बनाना, मैं एक चार सरणी के रूप में परिभाषित किया है। यह वह जगह है जहां आप पॉइंटर्स का सही उपयोग करते हैं?सी ++, एक चार सरणी

तो मेरा सवाल यह है कि इस चार सरणी में पॉइंटर बनाने का सही तरीका क्या है। क्या मैं केवल पहले तत्व को पॉइंटर बनाउंगा और फिर जब मैं उन मानों को संशोधित करना चाहता हूं जो मैं स्मृति के माध्यम से कदम उठाता हूं जब तक कि मैं अंत चरित्र को हिट नहीं करता?

+0

बस इसे देखा, हाँ \ 0 से बहुत बेहतर है।धन्यवाद –

उत्तर

14
char miniAlphabet[] = {'A','B','C','D','E', '\0'}; 

ये समकक्ष हैं।

char *p1 = miniAlphabet; 

char *p2 = &(miniAlphabet[0]); 

ध्यान दें कि () ऑपरेटरों पूर्वता के लिए बेकार हैं, तो

char *p3 = &miniAlphabet[0]; 

सी/C++ में एक सरणी के नाम सरणी के पहले तत्व के लिए सूचक है।

तो आप संकेत 'गणित का उपयोग कर सकते कुछ जादू करने के लिए ...

यह दूसरा तत्व को इंगित करेंगे:

char *p4 = &miniAlphabet[0] + 1; 

तरह
char *p5 = &miniAlphabet[1]; 

या

char *p6 = miniAlphabet + 1; 
+0

संपादन के लिए धन्यवाद, v.clear। –

+0

हाय, मेरे पास एक त्वरित सवाल है। जब आप char * p1 = miniAlphabet करते हैं, p1 अब सरणी के पहले तत्व का पता संग्रहीत करता है। कैसे आते हैं, जब हम cout << p1 << endl करते हैं, तो हमें संपूर्ण चार सरणी मिलती है (इस मामले में एबीसीडीई) और पहले तत्व का पता नहीं? –

+0

@ डैनीब्रॉउन क्योंकि * cout * के निर्माता ने ऐसा निर्णय लिया। यह किसी भी char * सूचक के लिए हमेशा "हैलो वर्ल्ड" लिखा होगा, लेकिन यह बेवकूफ होगा। यदि आप पाठ लिखने के पेशे में हैं, तो सबसे बुद्धिमान बात यह है कि एक स्ट्रिंग को एक स्ट्रिंग के रूप में प्रिंट करना है। यदि आप एक सूचक पता मुद्रित करना चाहते हैं, तो एक * << static_cast (पी 1) * – xanatos

1

पीओ स्मृति में सरणी का सिशन अपने पहले तत्व की स्थिति के समान है। उदाहरण के लिए, दोनों समारोह हस्ताक्षर नीचे बराबर हैं:

function changeArray(char[] myArray); 
function changeArray(char* myArray); 

और आप कॉल कर सकते हैं या तो इस तरह संस्करण:

changeArray(miniAlphabet); 

... या

changeArray(&(miniAlphabet[0])); 
+0

मैं इस धारणा के तहत था कि एक char * घोषणा पर निरंतर है। यह मामला है, क्या दूसरा फ़ंक्शन चार सरणी के बारे में कुछ भी नहीं बदल पाएगा, जबकि पहला कर सकता है? – MintyAnt

+0

आप फंक्शन के अंदर एक char * के मान को नहीं बदल सकते हैं, लेकिन आप इस मामले में, मान को इंगित कर सकते हैं। तो दोनों घोषणाएं मूल सरणी में परिवर्तन की अनुमति देती हैं। – Diego

1

आप एक सरणी पार कर लेते हैं एक फ़ंक्शन के लिए, आप एक सरणी चर के रूप में संदर्भ से गुजर रहे हैं वास्तव में सरणी में पहले तत्व के पते पर एक सूचक है। संक्षेप में

void funcName(char *miniAlphabet) { 
    ... 
} 
1

, हाँ: तो आप इस तरह एक समारोह कॉल कर सकते हैं:

funcName(miniAlphabet); 

और इस तरह "संदर्भ द्वारा" सरणी प्राप्त करते हैं। जब आप सरणी मिनीएल्बैबेट बनाते हैं तो आकार की सरणी और आपके द्वारा परिभाषित प्रकार के लिए एक सूचक होता है। जो पहले तत्व के सूचक भी है।

आप जो सुझाव दे रहे हैं उसका एक उदाहरण।

void foo(char *array) 
{ 
    array[0] = 'z'; 
    array[2] = 'z'; 
} 

... 

char myArray[] = { 'a', 'b', 'c'}; 
foo(myArray); 
//myArray now equals {'z', 'b', 'z'} 

नोट के भी, myArray को संदर्भित करने से आपको पहले तत्व में मूल्य मिल जाता है।

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