আপনি যে আচরণটি পেয়েছেন সেটি আসলে সি ভাষার একটি বড় মুরগি। যখনই আপনি কোনও ফাংশন ঘোষণা করেন যা একটি অ্যারে প্যারামিটার নেয়, সংকলক আপনাকে উপেক্ষা করে এবং পরামিতিটিকে পয়েন্টারে বদলে দেয়। সুতরাং এই ঘোষণাগুলি সমস্ত প্রথমটির মতো আচরণ করে:
void func(int *a)
void func(int a[])
void func(int a
typedef int array_plz[5];
void func(array_plz a)
চারটি ক্ষেত্রেই একটি পয়েন্টার হবে। আপনি যদি বিন্যাসকে কোনও অ্যারে পাস করেন তবে তা অবিলম্বে এর প্রথম উপাদানটির পয়েন্টারে ক্ষয় হবে। (64৪-বিট সিস্টেমে, 64৪-বিট পয়েন্টারটি 32-বিট ইন্টি থেকে দ্বিগুণ বড়, সুতরাং আপনার আকারের অনুপাতটি 2 ফিরে আসে)
এই নিয়মের একমাত্র উদ্দেশ্য historicalতিহাসিক সংকলকগুলির সাথে পিছনের সামঞ্জস্যতা বজায় রাখা যা ফাংশন আর্গুমেন্ট হিসাবে সামগ্রিক মানগুলি পাস করার পক্ষে সমর্থন করে না।
এর অর্থ এই নয় যে কোনও ফাংশনে অ্যারে পাস করা অসম্ভব। অ্যারেটিকে স্ট্রাক্টের মধ্যে এম্বেড করে আপনি এই ওয়ার্টটি ঘুরে দেখতে পারেন (এটি মূলত সি ++ 11 এর এসটিডি :: অ্যারের উদ্দেশ্য):
struct array_rly {
int a[5];
};
void func(struct array_rly a)
{
printf("%zd\n", sizeof(a.a)/sizeof(a.a[0])); /* prints 5 */
}
বা অ্যারেতে একটি পয়েন্টার দিয়ে:
void func(const int (*a)[5])
{
printf("%zd\n", sizeof(*a)/sizeof((*a)[0])); /* prints 5 */
}
অ্যারের আকার কোনও সংকলন-সময় ধ্রুবক না হলে আপনি C99 ভেরিয়েবল-দৈর্ঘ্যের অ্যারেগুলির সাথে পয়েন্টার-টু-অ্যারে প্রযুক্তি ব্যবহার করতে পারেন:
void func(int n, const int (*a)[n])
{
printf("%zd\n", sizeof(*a)/sizeof((*a)[0])); /* prints n */
}