"ক্ষয়" বলতে কোনও অ্যারে টাইপ থেকে পয়েন্টার টাইপের ক্ষেত্রে কোনও অভিব্যক্তির অন্তর্নিহিত রূপান্তরকে বোঝায়। বেশিরভাগ প্রসঙ্গে, যখন সংকলক একটি অ্যারে এক্সপ্রেশন দেখে এটি "T এর এন-এলিমেন্ট অ্যারে" থেকে "পয়েন্টার টিতে" রূপান্তরিত করে এবং অ্যারের প্রথম উপাদানটির ঠিকানায় অভিব্যক্তির মান সেট করে sets । এই নিয়মের ব্যতিক্রমগুলি হ'ল যখন কোনও অ্যারে sizeofবা &অপারেটরগুলির একটি অপরেন্ড হয় , বা অ্যারে একটি স্ট্রিং আক্ষরিক হয় যা একটি ঘোষণায় প্রারম্ভিক হিসাবে ব্যবহৃত হয়।
নিম্নলিখিত কোডটি ধরুন:
char a[80];
strcpy(a, "This is a test");
এক্সপ্রেশনটি a"চর-এর 80-অ্যারের অ্যারে" প্রকারের এবং "এটি একটি পরীক্ষা" এক্সপ্রেশনটি "চরের 16-উপাদান অ্যারে" টাইপের হয় (সি তে; C ++ স্ট্রিংয়ের অক্ষরে অক্ষরের চরের অ্যারে হয়)। যাইহোক, কলটিতে strcpy(), উভয়ই ভাব প্রকাশের sizeofবা অপরূপ নয় &, সুতরাং তাদের প্রকারগুলি স্পষ্টতই "চরকে পয়েন্টারে" রূপান্তরিত হয় এবং তাদের মানগুলি প্রতিটিের প্রথম উপাদানটির ঠিকানায় সেট করা থাকে। যা strcpy()প্রাপ্ত হয় তা অ্যারে নয়, পয়েন্টারগুলি যেমন এর প্রোটোটাইপে দেখা যায়:
char *strcpy(char *dest, const char *src);
এটি অ্যারে পয়েন্টার হিসাবে একই জিনিস নয়। উদাহরণ স্বরূপ:
char a[80];
char *ptr_to_first_element = a;
char (*ptr_to_array)[80] = &a;
উভয় ptr_to_first_elementএবং ptr_to_arrayএকই মান আছে ; এর মূল ঠিকানা তবে এগুলি বিভিন্ন ধরণের এবং নীচে দেখানো হিসাবে আলাদাভাবে চিকিত্সা করা হয়:
a[i] == ptr_to_first_element[i] == (*ptr_to_array)[i] != *ptr_to_array[i] != ptr_to_array[i]
মনে রাখবেন যে অভিব্যক্তি a[i]হিসাবে ব্যাখ্যা করা হয় *(a+i)(যা শুধুমাত্র কাজ করে অ্যারের ধরনের একটি পয়েন্টার টাইপ রূপান্তরিত হয়) উভয় তাই হয়, a[i]এবং ptr_to_first_element[i]কাজ একই। অভিব্যক্তি (*ptr_to_array)[i]হিসাবে ব্যাখ্যা করা হয় *(*a+i)। এক্সপ্রেশনগুলি *ptr_to_array[i]এবং ptr_to_array[i]প্রসঙ্গের উপর নির্ভর করে সংকলক সতর্কতা বা ত্রুটিগুলিতে বাড়ে; আপনি যদি তাদের কাছে মূল্যায়নের প্রত্যাশা করছেন তবে তারা অবশ্যই ভুল কাজ করবে a[i]।
sizeof a == sizeof *ptr_to_array == 80
আবার যখন একটি অ্যারে অপারেন্ড হয় তখন sizeofএটি পয়েন্টার ধরণের রূপান্তরিত হয় না।
sizeof *ptr_to_first_element == sizeof (char) == 1
sizeof ptr_to_first_element == sizeof (char *) == whatever the pointer size
is on your platform
ptr_to_first_element চরের জন্য একটি সাধারণ পয়েন্টার।
int a[10]; int b(void);, তারপরে+aএকটি ইনট পয়েন্টার এবং+bএটি একটি ফাংশন পয়েন্টার। আপনি যদি কোনও রেফারেন্স গ্রহণ করে কোনও টেম্পলেটটিতে এটি পাস করতে চান তবে দরকারী।