2010-04-18 11 views
7

मुझे उत्सुकता है कि यह एक त्रुटि क्यों है और त्रुटि संदेश का क्या अर्थ है। यहाँ कुछ कोड है:इस स्निपेट में पॉइंटर्स के साथ क्या हो रहा है?

int *x[] = {"foo", "bar", "baz"}; 
int *y[] = {"foo", "bar", "baz"}; 

x = y; 

मैं संकलित करने के लिए कोशिश करते हैं और मैं इस मिल:

error: incompatible types when assigning to type ‘char *[3]’ from type ‘char **’ 

प्रश्न # 1 कारण है कि यह एक त्रुटि है? और प्रश्न # 2 प्रकार अलग क्यों हैं?

+10

आप पूर्णांक पॉइंटर्स रखने वाले सरणी में वर्ण तार क्यों संग्रहीत कर रहे हैं? –

+0

क्या आपने लाइन नंबर देखा था? – SLaks

उत्तर

5

जैसा लिखा है, वहां कुछ समस्याएं हैं। सबसे पहले, सरणी अक्षर char*[] प्रकार हैं, जबकि x और yint*[] प्रकार के हैं। दूसरा, आप सरणी को सीधे असाइन नहीं कर सकते हैं, क्योंकि वे लगातार स्थिर पॉइंटर्स हैं।

+2

मैं वास्तव में चाहता हूं कि यह ज्ञापन मर जाएगा। Arrays निरंतर पॉइंटर्स नहीं हैं - वे किसी भी तरह के सूचक नहीं हैं, वे सरणी हैं (एक ही प्रकार की वस्तुओं का एक गैर खाली खाली अनुक्रम)। – caf

+1

एक वेरिएबल जिसका प्रकार सी में एक सरणी है, निरंतर पॉइंटर्स के समान ही अर्थशास्त्र का पालन करता है। यह गुरुत्वाकर्षण के साथ एक ही सौदा है - निश्चित रूप से, यह दुनिया भर में वास्तव में स्थिर नहीं है, और यह वास्तव में एक नीचे की शक्ति नहीं है। फिर भी, उन दोनों पहलुओं को व्यापक बहुमत के उपयोग के लिए सही मानना ​​उपयोगी है। –

3

एक असंगत प्रकार की त्रुटि है क्योंकि आप इन्ट्स के पॉइंटर्स के सरणी (जैसे int *x[]) पर तारों के सरणी (सी में टाइप करें * टाइप कर रहे हैं) को निर्दिष्ट कर रहे हैं। कंपाइलर द्वारा दिया गया त्रुटि संदेश थोड़ा उलझन में है क्योंकि सी दृश्यों के पीछे बहुत कुछ करता है ताकि चर को एक प्रकार से दूसरे में परिवर्तित करने का प्रयास किया जा सके।

जैसे वर्णों को आंतरिक रूप से संख्याओं के रूप में दर्शाया जाता है (अक्ष उनके एएससीआईआई मानों के अनुरूप होते हैं), सी अक्षरों को इंकों में परिवर्तित करने में सक्षम है, इसलिए यह एक्स और वाई को चर के बजाय वर्णों के लिए पॉइंटर्स के सरणी के रूप में व्यवहार करने का प्रयास करता है, इसलिए char *[3]। यह char ** टाइप के रूप में {"foo", "bar", "baz"} देखता है क्योंकि तार char * टाइप करते हैं और एरे अनिवार्य रूप से सी में पॉइंटर्स के रूप में संग्रहीत होते हैं, इसलिए यह char *, या char ** पर पॉइंटर है।

हालांकि यह आपके प्रश्न से पूरी तरह से संबंधित नहीं है, मुझे यह भी आश्चर्य है कि आप x = y; के साथ क्या करने का प्रयास कर रहे हैं जैसा कि यह लिखा गया है, जो x के समान सरणी को एक्स बिंदु बना देगा, एक्स का उपयोग करने वाले सरणी को छोड़कर पहुंचने के लिए इंगित करने के लिए। यह जांचने के लिए कि सी में दो चर बराबर हैं, आप == ऑपरेटर का उपयोग करेंगे। परीक्षण समानता सरणी या तारों के लिए उतनी आसान नहीं है, लेकिन यह पूरी तरह से इस प्रश्न के दायरे से बाहर है।

0

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

2

यह एक है त्रुटि, क्योंकि एक सरणी एक गैर-संशोधित lvalue है - जिसका अर्थ है कि आप इसे सीधे असाइन नहीं कर सकते हैं। आप केवल सरणी के सदस्यों को अलग-अलग संशोधित कर सकते हैं।

प्रकार अलग हैं क्योंकि यदि किसी सरणी को किसी संदर्भ में उपयोग किया जाता है जहां एक लाभा की आवश्यकता नहीं होती है, तो इसका मूल्यांकन उसके पहले तत्व (somearray प्रभावी ढंग से &somearray[0]) में होता है।

चूंकि इस संदर्भ में सरणी y का उपयोग किया जाता है, इसलिए इसका मूल्यांकन इसके पहले तत्व के पते के रूप में किया जाता है, जिसमें int ** टाइप किया गया है। चूंकि सरणी x एक लवली संदर्भ में है, तो इसे एक सरणी (int *[3]) के रूप में मूल्यांकन किया जाता है। (आपका त्रुटि संदेश वास्तव में आपके कोड से मेल नहीं खाता है - मुझे संदेह है कि आपके arrrays वास्तव में char * के सरणी हैं)।

("lvalue संदर्भ" का अर्थ है, काफी, में से एक: एक असाइनमेंट ऑपरेटर के बाएं हाथ की ओर (जो है, जहां नाम से आता है); sizeof ऑपरेटर का विषय है, या & ऑपरेटर के अधीन) ।

0

किसी कारण से मैं उसी खाते का उपयोग नहीं कर सकता जिसे मैंने प्रश्न प्रकाशित किया था।

"int" चीज मेरे हिस्से पर एक टाइपो थी, जिसका अर्थ है कि वास्तव में यह "char" होना था। गलतफहमी के लिए खेद है।

हालांकि, मुझे लगता है कि कैफ ने मेरे प्रश्न का उत्तर दिया।

"यह एक त्रुटि है, क्योंकि एक सरणी एक गैर-संशोधित अंतराल है - जिसका अर्थ है कि आप इसे सीधे असाइन नहीं कर सकते हैं। आप केवल सरणी के सदस्यों को अलग-अलग संशोधित कर सकते हैं।"

मैं सिर्फ यह समझने की कोशिश कर रहा हूं कि पॉइंटर्स सी में कैसे काम करते हैं, यही कारण है कि मैं इन यादृच्छिक चीजों को आजमा रहा हूं जो आप आमतौर पर नहीं करेंगे। मैंने सोचा कि यह काम कर सकता है क्योंकि मैंने एरेज़ = पॉइंटर्स सोचा था, इसलिए मैं सिर्फ एक्स पॉइंट कर सकता था। मुझे नहीं लगता?

आपके सभी प्रतिक्रिया लोगों के लिए धन्यवाद।

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