"ক্ষয়" বলতে কোনও অ্যারে টাইপ থেকে পয়েন্টার টাইপের ক্ষেত্রে কোনও অভিব্যক্তির অন্তর্নিহিত রূপান্তরকে বোঝায়। বেশিরভাগ প্রসঙ্গে, যখন সংকলক একটি অ্যারে এক্সপ্রেশন দেখে এটি "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
এটি একটি ফাংশন পয়েন্টার। আপনি যদি কোনও রেফারেন্স গ্রহণ করে কোনও টেম্পলেটটিতে এটি পাস করতে চান তবে দরকারী।