कुछ इस तरह की जाँच करने के काफी सरल है (क):
#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) -डिमेंशनल सरणी है, जिसे स्वयं को एक पॉइंटर में परिवर्तित किया जाता है यदि एक लेल्यू के अलावा अन्य उपयोग किया जाता है। यह इस प्रकार से चलता है कि सरणी पंक्ति-प्रमुख क्रम में संग्रहीत होती हैं (अंतिम सबस्क्रिप्ट सबसे तेज़ी से भिन्न होती है)।
मेरे लिए अच्छा लगता है। – JS1