সি এর অ্যারেগুলির চিকিত্সা জাভা থেকে খুব আলাদা এবং আপনাকে সেই অনুযায়ী আপনার চিন্তাভাবনা সামঞ্জস্য করতে হবে। সি-তে অ্যারেগুলি প্রথম-শ্রেণীর অবজেক্ট নয় (যা একটি অ্যারের এক্সপ্রেশনটি বেশিরভাগ প্রসঙ্গে এটি "অ্যারে-নেস" ধরে রাখে না)। সি-তে, "এন-এলিমেন্ট অ্যারের অফ 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
(যদিও শুধুমাত্র onlysrc
অ্যারে টাইপ রয়েছে)।
আপনি একটি এন-উপাদান অ্যারের একটি পয়েন্টার ঘোষণা করতে পারেন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
একটি সংকলন-সময় ধ্রুবক হওয়ার প্রত্যাশা করে, যার অর্থ এই ফাংশনটি কেবলমাত্র একটি অ্যারের আকারের সাথে কাজ করবে। দ্বিতীয়ত, সাবস্ক্রিপ্ট প্রয়োগ করার আগে আপনাকে পয়েন্টারটি অবলম্বন করতে হবে, যা কোডকে বিশৃঙ্খলা করে। আপনি বহুমাত্রিক অ্যারে নিয়ে কাজ করার সময় অ্যারেগুলিতে পয়েন্টারগুলি আরও ভাল কাজ করে।