2015-10-19 8 views
5

पॉइंटर सरणी में वृद्धि ऑपरेटर का उपयोग करते समय मुझे थोड़ा उलझन मिला।पॉइंटर सरणी में वृद्धि ऑपरेटर के साथ क्या गलत है?

कोड 1:

int main(void) { 
    char *array[] = {"howdy", "mani"}; 
    printf("%s", *(++array)); 
    return 0; 
} 

संकलन है, जीसीसी एक प्रसिद्ध त्रुटि "वेतन वृद्धि संकार्य के रूप में आवश्यक lvalue" फेंकता है।

लेकिन, जब मैं नीचे दिए गए कोड को संकलित करता हूं तो यह कोई त्रुटि नहीं दिखाता !!! क्यूं कर?

Code2:

int main(int argc, char *argv[]) { 
    printf("%s",*(++argv)); 
    return 0; 
} 

दोनों ही मामलों में, मैं सूचक की एक सरणी बढ़ाने की है। तो, यह इस तरह से किया जाना चाहिए।

char *array[] = {"howdy","mani"}; 
char **pointer = array; 
printf("%s",*(++pointer)); 

लेकिन, क्यों कोड 2 कोई त्रुटि नहीं दिखाता है?

+1

बहुत रोचक! मेरा अनुमान है कि यह 'char ** argv'] के बराबर 'char * argv []' मानता है लेकिन उपयोगकर्ता द्वारा परिभाषित सूचक के साथ सरणी नहीं है .. – Claudiu

+7

एक स्थानीय चर 'char * array [] 'पॉइंटर्स की एक सरणी है । एक फ़ंक्शन तर्क 'char * argv [] 'वास्तव में एक' char ** argv' है। सी 11 मसौदा मानक '6.7.6.3 फंक्शन घोषणाकर्ता (प्रोटोटाइप समेत), सेक्शन 7 पैरामीटर की घोषणा 'प्रकार की सरणी' 'के रूप में' 'टाइप करने के लिए योग्य पॉइंटर' 'में समायोजित की जाएगी। [...]'। – EOF

+2

'char * argv []' 'मुख्य()' decays 'char **' तक पारित किया गया है, न कि '' सरणी [] 'के' 'सरणी 'में आपके प्रत्यक्ष उपयोग के साथ' –

उत्तर

5

Arrays को बढ़ाया नहीं जा सकता है।

अपने पहले कोड नमूने में आप एक सरणी बढ़ाने की कोशिश करते हैं। दूसरे कोड नमूने में आप एक सूचक को बढ़ाने की कोशिश करते हैं।

आपको क्या ट्रिपिंग कर रहा है यह है कि जब एक सरणी घोषणाकर्ता फ़ंक्शन पैरामीटर सूची में प्रकट होता है, तो यह वास्तव में एक सूचक घोषणाकर्ता के रूप में समायोजित हो जाता है। (यह सरणी सूचक सूचक के लिए अलग है)। दूसरे स्निपेट में, char *argv[] वास्तव में char **argv का अर्थ है।

See this thread इसी तरह की चर्चा के लिए।

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