यहाँ मेरा उस पर ले लो:
C भाषा का विकास C में सरणी प्रकार के विकास में कुछ अंतर्दृष्टि प्रदान करता है:
मैं सरणी चीज़ को रेखांकित करने का प्रयास करूँगा:
C के अग्रदूतों B और BCPL का कोई अलग प्रकार नहीं था, जैसे घोषणा:
auto V[10] (B)
or
let V = vec 10 (BCPL)
V को एक (अनकैप्ड) पॉइंटर घोषित करेगा जो कि स्मृति के 10 "शब्दों" के अप्रयुक्त क्षेत्र को इंगित करने के लिए आरंभिक है। B पहले से ही *
पॉइंटर डेरेफ़रिंग के लिए उपयोग किया जाता है और []
शॉर्ट हैंड नोटेशन का *(V+i)
मतलब है V[i]
, जैसे कि आज C / C ++ में। हालांकि, V
यह एक सरणी नहीं है, यह अभी भी एक संकेतक है जिसे कुछ मेमोरी को इंगित करना है। इससे परेशानी हुई जब डेनिस रिची ने बी को संरचनात्मक प्रकारों के साथ विस्तारित करने का प्रयास किया। वह चाहता था कि सरणियों का हिस्सा हो, जैसे कि C में आज:
struct {
int inumber;
char name[14];
};
लेकिन बी, बीसीपीएल अवधारणा के साथ बिंदुओं के रूप में, यह name
क्षेत्र को एक पॉइंटर को समाहित करने की आवश्यकता होती है जिसे संरचना के भीतर 14 बाइट्स के मेमोरी क्षेत्र में रनटाइम पर आरंभीकृत किया जाना था । आरंभिक / लेआउट समस्या को अंततः एक विशेष उपचार देकर सरणियों को हल किया गया था: संकलक संरचनाओं में सरणियों के स्थान को ट्रैक करेगा, स्टैक आदि पर वास्तव में सूचक को डेटा को भौतिक बनाने की आवश्यकता के बिना, अभिव्यक्तियों को छोड़कर, जिसमें सरणियाँ शामिल हैं। इस उपचार ने लगभग सभी बी कोड को अभी भी चलाने की अनुमति दी और "एरे को पॉइंटर में कनवर्ट करें यदि आप उन्हें देखते हैं" नियम। यह एक कॉम्पेटिबिलिटी हैक है, जो बहुत उपयोगी साबित हुई, क्योंकि इसमें खुले आकार आदि के सरणियों की अनुमति थी।
और यहाँ मेरा अनुमान है कि सरणी को क्यों नहीं सौंपा जा सकता है: चूंकि सरणियाँ बी में संकेत थे, आप बस लिख सकते हैं:
auto V[10];
V=V+5;
एक "सरणी" को रिबेस करने के लिए। यह अब निरर्थक था, क्योंकि एक सरणी चर का आधार अब एक अंतराल नहीं था। इसलिए इस अस्मिता को ठुकरा दिया गया था, जिसने उन कुछ कार्यक्रमों को पकड़ने में मदद की जिन्होंने घोषित सरणियों पर यह पुन: काम किया। और फिर यह धारणा अटक गई: चूंकि सरणियों को सी प्रकार प्रणाली के प्रथम श्रेणी के अनुरूप होने के लिए कभी भी डिज़ाइन नहीं किया गया था, इसलिए उन्हें ज्यादातर विशेष जानवरों के रूप में माना जाता था जो आपके उपयोग करने पर सूचक बन जाते हैं। और एक निश्चित दृष्टिकोण से (जो इस बात की उपेक्षा करता है कि सी-सरणियां एक बॉटेड हैक हैं), सरणी असाइनमेंट को अस्वीकार करना अभी भी कुछ समझ में आता है: एक खुले सरणी या सरणी फ़ंक्शन पैरामीटर को आकार की जानकारी के बिना एक संकेतक के रूप में माना जाता है। संकलक के पास उनके लिए एक सरणी असाइनमेंट उत्पन्न करने के लिए जानकारी नहीं है और संगतता कारणों के लिए पॉइंटर असाइनमेंट की आवश्यकता थी।
typedef int vec[3];
void f(vec a, vec b)
{
vec x,y;
a=b;
x=y;
a=x;
x=a;
}
1978 में C के एक संशोधन ने संरचना असाइनमेंट ( http://cm.bell-labs.com/cm/cs/who/dmr/cchanges.pdf ) को बदल दिया। भले ही रिकॉर्ड सी में अलग-अलग प्रकार के थे , लेकिन उन्हें शुरुआती के एंड आर सी में असाइन करना संभव नहीं था। आपको उन्हें मेम्स्की के साथ सदस्य-वार कॉपी करना था और आप फ़ंक्शन मापदंडों के रूप में केवल पॉइंटर्स पास कर सकते थे। एसिगमेंट (और पैरामीटर पासिंग) को अब केवल संरचना की कच्ची मेमोरी के रूप में परिभाषित किया गया था और चूंकि यह मौजूदा कोड को तोड़ नहीं सकता था, यह आसानी से स्थगित हो गया था। एक अनपेक्षित साइड इफेक्ट के रूप में, इस निहित रूप से कुछ प्रकार के सरणी असाइनमेंट पेश किए गए थे, लेकिन यह एक संरचना के अंदर कहीं खुश था, इसलिए यह वास्तव में उस तरह की समस्याओं को पेश नहीं कर सका जिस तरह से सरणियों का उपयोग किया गया था।