2016-08-16 11 views
5

मुझे अभी अपने मित्र से एक प्रश्न मिला है।एल मूल्य वृद्धि ऑपरेटर के रूप में आवश्यक - सी

#include<stdio.h> 

void fun(int[][3]); 

int main(void){ 
    int a[3][3]={1,2,3,4,5,6,7,8,9}; 

    fun(a); 
    printf("\n%u",a); 
    a++;//Ques 1 

    printf("\n%u",a); 
    printf("%d",a[2][1]-a[1][2]); 

    return 0; 
} 

void fun(int a[][3]){ 
    ++a;//Ques 2 
    a[1][1]++; 
} 

लाइन Ques 1 एल मान की त्रुटि को 'ए' के ​​रूप में फेंक देगा, जो दो आयामी सरणी का नाम है। लेकिन यह लाइन Ques 2 के मामले में नहीं हो रहा है।

क्या कोई इस संदेह को साफ़ कर सकता है?

+0

देखें: http://stackoverflow.com/questions/1461432/what-is-array-decaying –

उत्तर

7

प्रश्न 1, a में एक सरणी है और ++ ऑपरेटर के ऑपरेंड के रूप में उपयोग किए जाने पर इसे गैर-लाइवलू पॉइंटर में परिवर्तित कर दिया जाएगा और संकलन त्रुटि उत्सर्जित किया जाएगा।

प्रश्न 2 में, तर्क int a[][3]int (*a)[3] और ++a के बराबर है पॉइंटर चर का एक वृद्धि है, जो स्वीकार्य है।

के रूप में '' 'प्रकार की सरणी' एक पैरामीटर का एक घोषणा प्रकार के लिए '' योग्य सूचक समायोजित किया जाएगा:

N1570 6.7.6.3 समारोह declarators (प्रोटोटाइप सहित), pargraph 7 से उद्धरण '', जहां टाइप क्वालीफायर (यदि कोई हैं) सरणी प्रकार व्युत्पन्न के [और] के भीतर निर्दिष्ट हैं।

0

ठीक है, पहले, "एल वैल्यू" का अर्थ है जिसे आप असाइन कर सकते हैं। a एक सरणी का नाम है। तो वह लाइन क्या करने की कोशिश कर रही है वैसा ही है जैसे आप सरणी पर पर कर रहे थे, जो समझ में नहीं आता है।

अब, आप यहां क्या चल रहे हैं यह है कि सी में सरणी का इलाज करने का कुछ भ्रमित तरीका है: वे वास्तव में स्मृति के केवल विशिष्ट हिस्सों हैं, और उनका नाम सरणी की शुरुआत के पते पर सीमित उपनाम है । जब आप एक सरणी पास करते हैं, तो सी वास्तव में कौन सी सी पास करता है वह सरणी का पता होता है (या इस मामले में, सरणी के अंदर स्मृति में किसी विशेष बिंदु का पता।) तो Ques 2 पर, यह वास्तव में एक सूचक है, जो है एल मान और बढ़ाया जा सकता है।

इसे "पॉइंटर्स को क्षय का क्षय" कहा जाता है (जैसा कि एक टिप्पणी में बताया गया है) और हाँ, यह भ्रमित हो सकता है।

2

जब किसी सरणी को फ़ंक्शन तर्क के रूप में पास किया जाता है, तो यह सरणी के पहले तत्व के सूचक को अस्वीकार करता है।

क्वेस्ट 1

a एक सरणी है, जो एक गैर-परिवर्तनीय lvalue है। तो इसे बढ़ाया नहीं जा सकता है।

क्वेस्ट 2

तर्क यह है कि int a[][3] पारित कर दिया है। यह पहले तत्व के लिए सूचक में होता है, जो int (*)[3] है, (और int *, सामान्य धारणा के विपरीत)। एक सूचक को बढ़ाया जा सकता है, इसलिए यह काम करता है।

इसके अलावा, आपको printf में पॉइंटर्स के लिए %p का उपयोग करना चाहिए, और %u नहीं।

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