C का सरणियों का उपचार जावा से बहुत अलग है, और आपको उसी के अनुसार अपनी सोच को समायोजित करना होगा। C में Arrays प्रथम श्रेणी की वस्तुएँ नहीं हैं (अर्थात, एक सरणी व्यंजक इसे अधिकांश संदर्भों में "array-ness" नहीं बनाए रखता है)। सी में, टाइप "एन-एलिमेंट एरे T
" की अभिव्यक्ति को "सिचुएशन टू टाइप" के एक एक्सप्रेशन में बदल दिया जाएगा T
, सिवाय इसके कि एरे एक्सप्रेशन sizeof
या अनरी &
ऑपरेटर्स का ऑपरेंड है या नहीं तो एरे एक्सप्रेशन एक स्ट्रिंग शाब्दिक है जिसका उपयोग घोषणा में दूसरे ऐरे को इनिशियलाइज़ करने के लिए किया जाता है।
अन्य बातों के अलावा, इसका मतलब है कि आप किसी फ़ंक्शन के लिए एक एक्सप्रेशन एक्सप्रेशन पास नहीं कर सकते हैं और इसे एरे टाइप के रूप में प्राप्त किया है ; फ़ंक्शन वास्तव में एक पॉइंटर प्रकार प्राप्त करता है:
void foo(char *a, size_t asize)
{
// do something with a
}
int bar(void)
{
char str[6] = "Hello";
foo(str, sizeof str);
}
कॉल करने के लिए foo
, अभिव्यक्ति str
को प्रकार से परिवर्तित किया char [6]
जाता है char *
, यही वजह है कि इसके बजाय पहले पैरामीटर foo
को घोषित किया char *a
जाता है char a[6]
। में sizeof str
, के बाद से सरणी अभिव्यक्ति का एक संकार्य है sizeof
ऑपरेटर, यह एक सूचक प्रकार के लिए परिवर्तित नहीं कर रहा है तो आप सरणी (6) में बाइट की संख्या मिलता है।
यदि आप वास्तव में रुचि रखते हैं, तो आप डेनिस रिची की द डेवलपमेंट ऑफ द सी लैंग्वेज यह समझने के लिए पढ़ सकते हैं कि यह उपचार कहां से आता है।
यह है कि कार्य सरणी प्रकारों को वापस नहीं कर सकता है, जो ठीक है क्योंकि सरणी अभिव्यक्तियाँ असाइनमेंट का लक्ष्य नहीं हो सकती हैं।
कॉल करने वाले के लिए सबसे सुरक्षित तरीका एरे को परिभाषित करना है, और इसके पते और आकार को उस फ़ंक्शन को पास करना है जो इसे लिखना है:
void returnArray(const char *srcArray, size_t srcSize, char *dstArray, char dstSize)
{
...
dstArray[i] = some_value_derived_from(srcArray[i]);
...
}
int main(void)
{
char src[] = "This is a test";
char dst[sizeof src];
...
returnArray(src, sizeof src, dst, sizeof dst);
...
}
फ़ंक्शन को गतिशील रूप से आवंटित करने और सूचक और आकार को वापस करने के लिए एक अन्य विधि है:
char *returnArray(const char *srcArray, size_t srcSize, size_t *dstSize)
{
char *dstArray = malloc(srcSize);
if (dstArray)
{
*dstSize = srcSize;
...
}
return dstArray;
}
int main(void)
{
char src[] = "This is a test";
char *dst;
size_t dstSize;
dst = returnArray(src, sizeof src, &dstSize);
...
free(dst);
...
}
इस मामले में, कॉलर free
लाइब्रेरी फ़ंक्शन के साथ सरणी से निपटने के लिए जिम्मेदार है।
ध्यान दें कि dst
उपरोक्त कोड में एक सरल सूचक है char
, न कि किसी सूचक को सरणी के लिए char
। सी के पॉइंटर और एरे सेमेंटिक्स ऐसे हैं कि आप सबस्क्रिप्ट ऑपरेटर []
को या तो एरे टाइप या पॉइंटर टाइप का एक्सप्रेशन दे सकते हैं ; दोनों src[i]
और dst[i]
का उपयोग करेंगे i
'सरणी के वें तत्व (भले ही केवल src
सरणी प्रकार है)।
आप एक एन-एलिमेंट एरे को पॉइंटर घोषित कर सकते हैंT
और कुछ ऐसा ही कर सकते हैं:
char (*returnArray(const char *srcArr, size_t srcSize))[SOME_SIZE]
{
char (*dstArr)[SOME_SIZE] = malloc(sizeof *dstArr);
if (dstArr)
{
...
(*dstArr)[i] = ...;
...
}
return dstArr;
}
int main(void)
{
char src[] = "This is a test";
char (*dst)[SOME_SIZE];
...
dst = returnArray(src, sizeof src);
...
printf("%c", (*dst)[j]);
...
}
उपरोक्त के साथ कई कमियां। सबसे पहले, सी के पुराने संस्करण SOME_SIZE
एक संकलन-समय स्थिर होने की उम्मीद करते हैं, जिसका अर्थ है कि फ़ंक्शन केवल एक सरणी आकार के साथ काम करेगा। दूसरे, आपको सबस्क्रिप्ट लागू करने से पहले पॉइंटर को स्थगित करना होगा, जो कोड को क्लैट करता है। जब आप बहुआयामी सरणियों के साथ काम कर रहे हों, तो सरणियों को बेहतर ढंग से चलाने के लिए पॉइंटर्स।