सी

2014-11-13 2 views
5

में किसी सरणी में किसी इंडेक्स का पता ढूंढें सी में एक सरणी की परिभाषा को देखते हुए: int a [2] [3] [4] [5], और [0] [0] का पता [ 0] [0] 1000 है [1] [1] [1] [1] का पता क्या है, मानते हैं कि एक int 4 बाइट्स पर कब्जा कर लेता है।सी

मुझे मिल गया:

(3 * 4 * 5 * 4bytes) + (4 * 5 * 4bytes) + (5 * 4bytes) + 4bytes = 344

344 + 1000 = 1344 स्थान एक [1] [1] [1] [1]

लेकिन मुझे नहीं पता कि मैं सही हूं या नहीं। लेकिन मेरा गणित मेरे लिए लग रहा था।

+0

मेरे लिए अच्छा लगता है। – JS1

उत्तर

3

बस चर का पता प्रिंट किसी भी आप इसे उसके बाद देखेंगे !:

#include <stdio.h> 

int main() { 

    int a[2][3][4][5]; 

    printf ("Size of int %d\n", sizeof(int)); 

    printf("Adress of the frist element \t%p\n", &a[0][0][0][0]); 
    printf("Adress of x element \t\t%p\n", &a[1][1][1][1]); 

    printf ("In decimal: \t\t\t%d\n", &(a[0][0][0][0])); 
    printf ("In decimal: \t\t\t%d\n", &(a[1][1][1][1])); 

    printf("Difference between the adresses %d", (char *)&a[1][1][1][1] - (char *)&a[0][0][0][0]); 




    return 0; 

} 

अगर आप जहां सही जांच कर सकते हैं!

और जैसा कि आप अपना अधिकार देखते हैं! यह 334

+0

आपका दूसरा 'printf'' [1] [1] [1] [0] 'का पता देता है, न कि एक [1] [1] [1] [1]'। आप जो करने की कोशिश कर रहे हैं उसके बारे में सरल क्यों न हों और 'और एक [0] [0] [0] [0] 'लिखें? –

+0

@RedAlert Wups 1 आयाम भूल गया! धन्यवाद – Rizier123

+0

'% d' एक सूचक के साथ समस्याग्रस्त है (विशेष रूप से यदि int 32 बिट है और पॉइंटर 64 बिट है), [uintptr_t] (http://stackoverflow.com/questions/5795978/string-format-for-intptr-t का उपयोग करने पर विचार करें) -and-uintptr-t) –

0

कुछ इस तरह की जाँच करने के काफी सरल है (क):

#include <stdio.h> 

int main (void) { 
    int a[2][3][4][5]; 

    // Ignore incorrect format specifiers for now. 

    printf ("%d\n", sizeof(int)); 
    printf ("%d\n", &(a[0][0][0][0])); 
    printf ("%d\n", &(a[1][1][1][1])); 
    printf ("%d\n", (int)&(a[1][1][1][1]) 
        - (int)&(a[0][0][0][0]) 
        + 1000); 

    return 0; 
} 

और उस के उत्पादन में है: int मूल्यों के संकेत के

4 
2665056 
2665400 
1344 

नोट रूपांतरण उस अंतिम printf में। इसके बिना, 1000 को गलत मान देने के साथ int * के रूप में स्केल किया जाएगा।

तो, हाँ, नीचे की रेखा, आपका तर्क सही है।


(क) है कि वे नहीं हमेशा मामले के बाद से सी भाषा के कुछ पहलुओं कार्यान्वयन भिन्न हो सकते हैं (कार्यान्वयन द्वारा निर्दिष्ट व्यवहार) या किसी भी तरह से चाहते हैं (अपरिभाषित व्यवहार)।

सौभाग्य से, सरणियों के लेआउट मानक द्वारा विशेष रूप से निर्दिष्ट है, C11 6.5.2.1 Array subscripting में:

2/ए पोस्टफ़िक्स वर्ग कोष्ठक में एक अभिव्यक्ति के बाद अभिव्यक्ति [] एक सरणी के एक तत्व के एक subscripted पद है वस्तु। सबस्क्रिप्ट ऑपरेटर [] की परिभाषा यह है कि E1[E2](*((E1)+(E2))) के समान है। क्योंकि रूपांतरण नियम है कि, द्विआधारी + ऑपरेटर के लिए लागू करता है, तो E1 एक सरणी वस्तु (समतुल्य रूप, एक सरणी वस्तु के प्रारंभिक तत्व के लिए सूचक) और E2 एक पूर्णांक है की, E1[E2] निर्दिष्ट E1 की E2-th तत्व (शून्य से गिनती)।

3/लगातार सबस्क्रिप्ट ऑपरेटर एक बहुआयामी सरणी वस्तु का एक तत्व निर्दिष्ट करते हैं। यदि E आयाम i * j * ... * k के साथ एक एन-आयामी सरणी (n> = 2) है, तो E (एक lvalue के अलावा अन्य के रूप में उपयोग किया जाता है) को एक पॉइंटर में एक (एन -1) -डिमेंशनल सरणी में आयाम j * ... * k के साथ परिवर्तित किया जाता है।यदि यूनरी * ऑपरेटर को इस पॉइंटर पर स्पष्ट रूप से लागू किया गया है, या सबस्क्राइबिंग के परिणामस्वरूप स्पष्ट रूप से, परिणाम संदर्भित (एन -1) -डिमेंशनल सरणी है, जिसे स्वयं को एक पॉइंटर में परिवर्तित किया जाता है यदि एक लेल्यू के अलावा अन्य उपयोग किया जाता है। यह इस प्रकार से चलता है कि सरणी पंक्ति-प्रमुख क्रम में संग्रहीत होती हैं (अंतिम सबस्क्रिप्ट सबसे तेज़ी से भिन्न होती है)।

+1

कि आउटपुट अजीब लगता है, '2665400 - 2665056 + 1000'' 1086' नहीं है। मुझे लगता है कि संकलक सोचता है कि आप पॉइंटर अंकगणित करने की कोशिश कर रहे हैं। –

+1

@RedAlert, हां, बस ध्यान दिया गया है, और आप किसी को अपने बेल्ट के नीचे जितना सी के साथ सोचेंगे, उतना ही मुझे पता होगा कि :-) ठीक करने के लिए संशोधित किया गया है। – paxdiablo

3

आपका गणित सही है। आप दो पतों को घटाकर की जांच कर सकते हैं, लेकिन भूल नहीं है कि सूचक अंकगणित प्रकार आकार का पता होगा, ताकि आप जो एक बाइट के आकार की है चार के लिए पतों कास्ट करने के लिए है: जो देता है

(char*)&a[1][1][1][1] - (char*)&a[0][0][0][0] 

बाइट्स में अंतर। फिर बस प्रारंभिक पता जोड़ें और आपका जवाब है।