এই হ্যাকটি বুঝতে, প্রথমে আপনাকে পয়েন্টার পার্থক্যটি বুঝতে হবে, অর্থাত্, যখন একই অ্যারের উপাদানগুলিতে নির্দেশিত দুটি পয়েন্টারগুলি বিয়োগ করা হয় তখন কী ঘটে ?
যখন একটি পয়েন্টার অন্য থেকে বিয়োগ করা হয়, ফলাফলটি পয়েন্টারগুলির মধ্যে দূরত্ব (অ্যারে উপাদানগুলিতে পরিমাপ করা হয়)। সুতরাং, যদি p
পয়েন্ট করে a[i]
এবং q
নির্দেশ করে a[j]
তবে p - q
সমান equali - j
।
সি 11: 6.5.6 অ্যাডিটিভ অপারেটর (p9):
যখন দুটি পয়েন্টার বিয়োগ করা হয় , উভয়ই একই অ্যারে অবজেক্টের উপাদানগুলিকে নির্দেশ করবে বা অ্যারে অবজেক্টের শেষ উপাদানটির একটিতে; ফলাফলটি দুটি অ্যারের উপাদানগুলির সাবস্ক্রিপ্টগুলির পার্থক্য । [...]।
অন্য কথায়, যদি ক্রমান্বয়ে অভিব্যক্তি P
এবং Q
নির্দেশিত হয়, যথাক্রমে, একটি অ্যারে অবজেক্টের i
চতুর্থ ও- j
তম উপাদানগুলি, এক্সপ্রেশনটির (P)-(Q)
মানi−j
প্রদান করে মানটি টাইপের কোনও বস্তুর সাথে মানিয়ে যায় ptrdiff_t
।
এখন আমি প্রত্যাশা করছি যে আপনি পয়েন্টারে অ্যারে নাম রূপান্তর সম্পর্কে অবগত আছেন, a
পয়েন্টারে অ্যারের প্রথম উপাদানকে রূপান্তর করেন a
। &a
পুরো মেমরি ব্লকের ঠিকানা, অর্থাত্ এটি অ্যারের ঠিকানা a
। নীচের চিত্রটি আপনাকে বুঝতে সহায়তা করবে ( বিস্তারিত ব্যাখ্যাের জন্য এই উত্তরটি পড়ুন ):
এটি আপনাকে বুঝতে সহায়তা করবে যে কেন a
এবং &a
একই ঠিকানা রয়েছে এবং (&a)[i]
আমি কী অ্যারের ঠিকানা ( যেটির আকারের একই আকার a
)।
সুতরাং, বিবৃতি
return (&a)[n] - a;
সমতুল্য
return (&a)[n] - (&a)[0];
এবং এই পার্থক্য পয়েন্টার মধ্যে উপাদানের সংখ্যা দেব (&a)[n]
এবং (&a)[0]
, যা হয় n
অ্যারে প্রতিটিn
int
উপাদানকে করে। সুতরাং, মোট অ্যারে উপাদানগুলি n*n
= n
2 ।
বিঃদ্রঃ:
সি 11: 6.5.6 অ্যাডিটিভ অপারেটর (p9):
যখন দুটি পয়েন্টার বিয়োগ করা হয়, উভয়ই একই অ্যারে অবজেক্টের উপাদানগুলিকে নির্দেশ করবে বা অ্যারে অবজেক্টের শেষ উপাদানটির একটিতে ; ফলাফলটি দুটি অ্যারের উপাদানগুলির সাবস্ক্রিপ্টগুলির পার্থক্য। ফলাফলের আকারটি বাস্তবায়ন-সংজ্ঞায়িত হয় এবং এর প্রকার (স্বাক্ষরিত পূর্ণসংখ্যার প্রকার) শিরোনামে ptrdiff_t
সংজ্ঞায়িত করা হয় <stddef.h>
। ফলাফল যদি সেই ধরণের কোনও বস্তুর মধ্যে উপস্থাপনযোগ্য না হয়, তবে আচরণটি সংজ্ঞায়িত।
যেহেতু (&a)[n]
একই অ্যারে অবজেক্টের উপাদানগুলির দিকে ইঙ্গিত করে না বা অ্যারে অবজেক্টের শেষ উপাদানটির একটিও অতীত হয় না, তাই অপরিজ্ঞাত আচরণের জন্য(&a)[n] - a
প্রার্থনা করবে ।
এছাড়াও মনে রাখবেন, ভাল ফাংশনের রিটার্ন টাইপ পরিবর্তন করতে p
করতে ptrdiff_t
।