আমার খুব ব্যক্তিগত মতামতটি হ'ল তীরগুলি সহ ছবিগুলি এইভাবে নির্দেশ করছে বা এটি পয়েন্টারগুলিকে বোঝা আরও শক্ত করে তোলে। এটি তাদের কিছু বিমূর্ত, রহস্যময় সত্তার মতো করে তোলে। তারা না.
আপনার কম্পিউটারে থাকা সমস্ত কিছুর মতো পয়েন্টারও সংখ্যা । "পয়েন্টার" নামটি "ঠিকানা সহ একটি ভেরিয়েবল" বলার অভিনব উপায়।
অতএব, কম্পিউটার আসলে কীভাবে কাজ করে তা ব্যাখ্যা করে আমার চারপাশে জিনিসগুলি আলোড়িত করা যাক।
আমাদের একটি আছে int
, এর নাম i
এবং মান রয়েছে This এটি মেমরিতে সঞ্চয় করা হয়। স্মৃতিতে সঞ্চিত সমস্ত কিছুর মতো এটির একটি ঠিকানা প্রয়োজন, বা আমরা এটি সন্ধান করতে পারব না। আসুন i
ঠিকানা 0x12345678 এ শেষ হতে দেয় এবং এর j
6 নম্বর সহ বন্ধুটি এর ঠিক পরে শেষ হয়। একটি 32-বিট সিপিইউ ধরে নেওয়া যেখানে int 4 বাইট এবং পয়েন্টার 4 বাইট হয়, তারপরে ভেরিয়েবলগুলি শারীরিক স্মৃতিতে এইভাবে সংরক্ষণ করা হয়:
Address Data Meaning
0x12345678 00 00 00 05 // The variable i
0x1234567C 00 00 00 06 // The variable j
এখন আমরা এই ভেরিয়েবলগুলিতে নির্দেশ করতে চাই। আমরা int এর জন্য একটি পয়েন্টার তৈরি করি int* ip1
, এবং একটি int* ip2
। কম্পিউটারের সমস্ত কিছুর মতো, এই পয়েন্টার ভেরিয়েবলগুলি স্মৃতিতেও কোথাও বরাদ্দ পাওয়া যায়। ধরে নেওয়া যাক তারা পরের সংলগ্ন ঠিকানাগুলিতে মেমরির সাথে সাথেই শেষ হয় j
। আমরা পূর্বে বরাদ্দ করা ভেরিয়েবলের ঠিকানাগুলি রাখতে পয়েন্টারগুলি সেট করেছি: ip1=&i;
("আইপিটির আইপিটির ঠিকানাটি অনুলিপি করুন") এবং ip2=&j
। লাইনের মধ্যে যা ঘটে তা হ'ল:
Address Data Meaning
0x12345680 12 34 56 78 // The variable ip1(equal to address of i)
0x12345684 12 34 56 7C // The variable ip2(equal to address of j)
সুতরাং আমরা কি পেয়েছিলাম মাত্র 4 মেমরি সংখ্যা বাইট অংশ আছে। দেখার মতো কোথাও কোনও রহস্যময় বা যাদুকর তীর নেই।
প্রকৃতপক্ষে, কেবল একটি মেমরি ডাম্প দেখে, আমরা 0x12345680 ঠিকানাটি একটি int
বা আছে কিনা তা বলতে পারি না int*
। পার্থক্যটি হল কীভাবে আমাদের প্রোগ্রামটি এই ঠিকানায় সঞ্চিত সামগ্রীগুলি বেছে নিতে বেছে নেয়। (আমাদের প্রোগ্রামটির কাজটি কেবল এই সংখ্যাগুলির সাথে কী করা উচিত তা কেবল সিপিইউকে জানানো))
তারপরে আমরা ইন্ডিয়ারেশনের আরও একটি স্তর যুক্ত করি int** ipp = &ip1;
। আবার আমরা কেবল স্মৃতিশক্তি পেয়েছি:
Address Data Meaning
0x12345688 12 34 56 80 // The variable ipp
প্যাটার্নটি পরিচিত বলে মনে হচ্ছে না। তবুও আরও একটি সংখ্যা 4 টি বাইট রয়েছে a
এখন, যদি আমাদের উপরের কাল্পনিক ছোট্ট র্যামের একটি মেমরি ডাম্প থাকে তবে আমরা ম্যানুয়ালি পরীক্ষা করতে পারি যে এই পয়েন্টারগুলি কোথায় নির্দেশ করে। ipp
ভেরিয়েবলের ঠিকানায় কী সঞ্চিত তা আমরা উঁকি মারি এবং 0x12345680 সামগ্রীটি পাই। কোনটি অবশ্যই ঠিকানা যেখানে ip1
সঞ্চিত আছে। আমরা সেই ঠিকানায় যেতে পারি, সেখানকার বিষয়বস্তুগুলি পরীক্ষা করতে পারি, এবং তার ঠিকানা খুঁজে পেতে i
পারি এবং শেষ পর্যন্ত আমরা সেই ঠিকানায় যেতে পারি এবং 5 নম্বরটি খুঁজে পেতে পারি।
সুতরাং আমরা যদি আইপিপি এর বিষয়বস্তু গ্রহণ করি *ipp
, আমরা পয়েন্টার ভেরিয়েবলের ঠিকানা পাব ip1
। লিখে *ipp=ip2
আমরা আইপি 2 কে আইপি 1 এ অনুলিপি করি, এটি সমান ip1=ip2
। উভয় ক্ষেত্রে আমরা পেতে হবে
Address Data Meaning
0x12345680 12 34 56 7C // The variable ip1
0x12345684 12 34 56 7C // The variable ip2
(এই উদাহরণগুলি একটি বড় এন্ডিয়ান সিপিইউর জন্য দেওয়া হয়েছিল)
ipp
সংজ্ঞা দেওয়ার সময় এর ধরণ যুক্ত করুন , সুতরাং আপনার প্রশ্নটি সম্পূর্ণ হয়ে গেছে ;-)