2012-04-07 10 views
5

संभव डुप्लिकेट:
C - Difference between “char var[]” and “char *var”?अंतर [] सी में

मैं निम्नलिखित सी कोड

#include<stdio.h> 
int main() 
{ 
    char name[31]; 
    char *temp; 
    int i ; 
    scanf("%s",name); 
    temp = name; 
    name = temp; 

} 

मैं निम्नलिखित त्रुटि मिली लिखा है

संकलित करते समय

ऐरे नाम पहले तत्व के लिए एक सूचक है (यहां चार सूचक .. सही?)। सही? उपरोक्त कोड का अर्थ है कि चरित्र सरणी और चार * अलग-अलग प्रकार हैं .. क्या यह सच है? क्यों नाम के प्रकार! = चार * मैं क्यों, एक चार सूचक (सरणी नाम) के लिए एक और चार सूचक

+0

कृपया यहां एक प्रश्न पूछने से पहले सी अकसर किये गए सवाल देखें। –

उत्तर

5

"ऐरे नाम पहले तत्व (यहां चार सूचक .. सही?) के लिए एक सूचक है। सही?"

char name[31]; 
char *temp; 
/* ... */ 
name = temp; 

name = temp काम में, name का मूल्य char के लिए सूचक में बदल जाती है। मान परिवर्तित हो गया है, ऑब्जेक्ट नहीं है। ऑब्जेक्ट अभी भी एक सरणी है और सरणी संशोधित अंतराल नहीं हैं। असाइनमेंट ऑपरेंड की बाधाओं के रूप में असाइनमेंट ऑपरेटर के बाएं ऑपरेंड को एक संशोधित अंतराल की आवश्यकता होती है, आपको एक त्रुटि मिली है।

+0

डाउनवॉटर, कृपया बताएं कि आपने यह उत्तर क्यों दिया है। – ouah

+0

+1 क्षतिपूर्ति करने के लिए :) –

+0

@JensGustedt धन्यवाद जेन्स;) – ouah

1

पहले, सरणियों स्मृति बफ़र्स, नहीं संकेत दिए गए हैं असाइन नहीं कर सकते जब जरूरत हालांकि वे संकेत को सड़ा हुआ हो सकता है।

अब, name एक सरणी है, इसलिए आप इसे असाइन नहीं कर सकते हैं। जब आप किसी पॉइंटर को सरणी निर्दिष्ट करते हैं, तो सरणी को पॉइंटर पर क्षीण कर दिया जाता है, और असाइनमेंट मान्य है।

+0

यह मेरे लिए नई जानकारी लिंक के लिए –

9

ऐरे नाम पहले तत्व (यहां चार सूचक .. सही?) के लिए एक सूचक है। सही?

गलत। अधिकांश संदर्भों में पहले तत्व के लिए एक सूचक के लिए Arrays क्षय, लेकिन वे निश्चित रूप से पॉइंटर्स नहीं हैं। वहाँ (एक एक सरणी है और पी एक सूचक है) C FAQ में एक अच्छा विवरण और एक अमूल्य तस्वीर है:

Arrays and pointers

असंगत प्रकार जब प्रकार से 'चार [31]' टाइप करने के लिए बताए 'चार * '

सी सरणियों में गैर-परिवर्तनीय lvalues ​​हैं, तो आपको उनके क्योंकि वे पहली जगह में कहीं भी इंगित नहीं करते बात नहीं बदल सकते।

+0

धन्यवाद है ... धन्यवाद ... –

+0

ठीक है ... हो गया बिंदु सरणियों गैर परिवर्तनीय lvalues ​​रहे हैं ... इसका मतलब है कि मैं भी ऐसा नहीं कर सकते चार नाम [31] ; चार अस्थायी [31]; int i; स्कैनफ़ ("% s", नाम); temp = name; नाम = temp; सही? ... जब मैं यहां टिप्पणी करता हूं तो कोड कैसे इंडेंट करना है? :) –

+0

स्कैनफ़ा लगभग ठीक है (& ड्रॉप)। बाकी गलत है। – cnicutar

1

नहीं, सूचक एक ही प्रकार की वस्तु की ओर इंगित करता है। इसका मतलब यह है कि यदि पॉइंटर को पूरी तरह से आवंटित सरणी के रूप में उपयोग किया जा सकता है तो इसे ठीक से आवंटित किया जाता है।
एक गैर पॉइंटर का मतलब है कि आपके पास "आपके सामने" डेटा है, जो आपको डेटा को सही ढंग से प्राप्त करने की अनुमति नहीं देता है (इसमें जीवन की समस्या भी होती है), इसलिए ईमानदार होने के लिए, पॉइंटर्स का उपयोग करना बेहतर होता है हर जगह आपके मामले में।

1

क्योंकि 'नाम' एक सरणी है। तो यह लाइन:

name = temp; 

आपको त्रुटि देगा।

इसके अलावा लूप में आपकी स्थिति गलत है। नाम [] में जंक वैल्यू होंगे और आप

name[i]!='\0' 

किसी शर्त के रूप में उपयोग नहीं कर सकते हैं।

+0

पर भी एक ही त्रुटि देता है बस उस बग को हटा दें –

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