পয়েন্টার নিয়ে লিখতে বসা এইটা maybe 4 নাম্বার পোষ্ট ,আগের
গুলা কেটে দিছি, লিখতে গেলে এত এত বড় হয়ে যায়,
তারপরেও মনে হয় যে আইডিয়া ক্লিয়ার হয়না তখন সব বাদ দিয়ে দেই, কিভাবে লিখলে বেসিক আইডিয়াটুক
সহজে ক্লিয়ার হবে বুঝছি না, এটা হয়তো ফাইনাল
পোষ্ট হবে এখনও জানি না কেমনে লিখব ।
পয়েন্টার কি?
উত্তরঃ পয়েন্টার হচ্ছে এমন একটা ভ্যারিয়েবল যেটা নিজের মধ্যে
শুধু মেমোরি address রাখতে পারে। যেই টাইপের ভ্যারিয়েবলের মেমোরি address রাখতে চাইবো
সেই সেম টাইপের পয়েন্টার হতে হবে, যেমনঃ
int a=5; a এর address রাখতে চাইলে
int *ptr; ptr=&a;
পয়েন্টারের টাইপও ইন্টিজার হতে হবে
আবার,
float fur=10.02;
float *pt;
pt=&fur;
মোদ্দাকথা পয়েন্টার যেই টাইপের হবে সেই টাইপের ভ্যারিয়েবলের
ঠিকানা নিজের মধ্যে রাখতে পারবে।
·
কোনো ভ্যারিয়েবলের সামনে ‘&’
(ampersion) সাইনটা দিয়ে ঐ ভ্যারিয়েবলের
address পাওয়া যায়, আপনার সামনে ‘&’ দিয়ে দিলে আপনার ঠিকানা পাওয়া যাবে যদি আপনি
ভ্যারিয়েবল হইতেন ।
·
কোনো ঠিকানার সামনে ‘*’ (asterisk) সাইনটা দিয়ে
দিলে ঐ ঠিকানার মানুষকে পাওয়া যায় । মানে
int a=5;
a
এর মধ্যে ৫ আছে? কিন্তু কেউ আপনাকে a এর ভ্যালু
না বলে a এর ঠিকানা বলে দিয়েছে, &a এখন
আপনি যদি &a এর সামনে * দেন তাহলে আপনি
ভ্যালুটা পেয়ে যাবেন
printf(“%d\n”,*&a); // 5
কারো সামনে & দিলে address আর address এর সামনে * দিলে
ঐ ভ্যারিয়েবলের ভ্যালু পাওয়া যায়।
তাহলে পয়েন্টারের মধ্যে কি থাকে? Address থাকে।
আর এখনি কি জানলাম? Address এর সামনে * দিলে কি পায়? সেটার ভ্যালু
পেয়ে যায়, তার মানে পয়েন্টারের সামনে * দিলে কি পাব? পয়েন্টারের মধ্যে address থাকে
তবে অন্যের, যার address থাকবে তার ভ্যালু
পাব।
int a=5;
int *ptr; //এইখানে
* দিলাম কারণ পয়েন্টার ডিক্লেয়ারের নিয়মই এটা তাই দিতে বাধ্য আমি। এইখানে * দেয়া মানে
কিন্তু ভ্যালু বুঝাবে এমন না, এটা just declare করার নিয়ম মাত্র।
ptr=&a; //
a এর address রাখলাম
এখন,
*ptr সমান = a সমান = 5; এই লাইনটা মানে হচ্ছে?
যখন address এর সামনে * দিব তখন সেটা ভ্যারিয়েবলের মত কাজ
করে। মানে *ptr লিখা আর
a লিখা একই ব্যাপার।
a= 10; করে দেয়া
আর
*ptr =10; লিখা একই কথা
*ptr এটা ভ্যারিয়েবলের মত সার্ভিস দেই। a=10 লিখলে যেমন a এর ভ্যালু ৫ বাদ হয়ে ১০ হয়ে যাবে,
তেমনি *ptr =10; লিখলেও একইভাবে a এর ভ্যালু চেঞ্জ হয়ে যাবে, ভ্যালু চেঞ্জ মানে ঐযে
ভ্যারিয়েবল a এর address এর মধ্যেকার ভ্যালু চেঞ্জ হচ্ছে, এই চেঞ্জটা কিভাবে করছি?
পয়েন্টার দিয়ে ।
পয়েন্টারের মধ্যে মেমোরি address রাখতে পারি আর এই
address দিয়ে অনেক কিছু করতে পারি ,এগুলা পরে শিখব in sha Allah।
পয়েন্টার নিজের মধ্যে শুধু address রাখতে পারে এছাড়া আর কিছুই
রাখা সম্ভব না, এখন অনেকের এটা মনে হইতে পারে
#include
int *pt; //pointer declare
pt=5; //value assign
printf(“%d\n”, pt); //prints 5
ভ্যালু ৫ রাখলাম এটা তো প্রিন্ট হচ্ছেই, কিন্তু না ভাই এইখানে ঐ ৫ কেউ একটা address হিসেবে নিয়েছে । ,
প্রমাণ দাও ?
প্রমাণঃ
pt++; // এটা করলে
pt এর ভ্যালু ১ বেড়ে ৬ হওয়ার কথা
কিন্তু,
printf(“%d\n”, pt);
//prints 9
মানে ৫ এর পরে ৯, এর পরে ১৩ , চার(৪) করে বাড়বে, কারণ ইন্টিজারের
একটা ভ্যারিয়েবলের সাইজ ৪ বাইট , তাই address er জন্য এভাবে ৪ করে বাড়বে, এই চার করে
বাড়ছে দেখে বুঝতেই পারি এই পয়েন্টারের মধ্যে রাখা ৫ মানেই ইন্টিজার ৫ নয়, পয়েন্টারে কোনো কিছু
রাখলে সেটাকে memory address হিসেবে নিবে ।
Double Pointer:
Double Pointer এর ব্যাপারটা এমন যে, একটা পয়েন্টার নিজের মধ্যে আরেকটা পয়েন্টারের address রাখবে।
যখন আমরা একটা পয়েন্টার নিয়ে শিখেছি তখন আমরা একটা স্টার
দিয়েছিলাম, আর এখন যেহেতু ডাবল পয়েন্টার তাই দুইটা ** দুইটা
স্টার দিব।
int **dp;
int *sp;
dp=&sp;
//dp এর স্টার দুইটা তাই dp এর পাওয়ার বেশি, যত বেশী স্টার ততো বেশী পাওয়ার,
‘*’ গুলা হচ্ছে তাদের ক্ষমতা যদি আমরা এভাবে করি,
int a=5;
int *sp, **dp;
sp=&a;
dp=&sp;
ধরেন, a এর memory address 200, sp এর memory address 520,
sp=&a; //মানে sp= 200 রাখলাম বা sp তে a এর address রাখলাম
dp=&sp; //মানে
dp= 520 রাখলাম বা dp তে sp এর address রাখলাম
·
sp এর মধ্যে a এর address আছে, address এর সামনে
* দিলে a এর ভ্যালু পেয়ে যায়, মানে *sp প্রিন্ট
করলে ৫ পাব;
·
dp এর মধ্যে sp এর address আছে, তাহলে *dp প্রিন্ট
করলে sp এর ভ্যালু পাব যেটা ২০০, এই ২০০ আবার a এর address, ,dp এর আবার দুইটা * ছিল
(**dp) , একটা *dp দিলে sp এর ভ্যালু পাচ্ছি, আরেকটা * দিলে **dp প্রিন্ট করলে sp এর মধ্যে যার address ছিল
(মানে a এর address) তার value পাব,
**dp
=5
মানে
**dp বলতে যা বুঝাই, *sp মানেও তাই আবার a মানেও একই ,
এই কন্সেপট(Double
Pointer) বুঝলে ভাল, না বুঝলে নাই, এটা লাগবে
না বললেই চলে ডেটা স্ট্রাকচারের জন্য।
Pointer
to an Array:
এইখানে শিখব পয়েন্টার দিয়ে কিভাবে array Access করব সেটা।
একটা Array যখন ডিক্লেয়ার করি তখন সেটা মেমোরিতে একটা কন্টিজিয়াস
মেমোরি নেই, মানে একদম পাশাপাশি মেমোরি। আপনি জানতে পারবেন যে এর পরেরটা পাশেই আছে।
int a[ ]=
{1,3,14,56,74};
এইভাবে যখন একটা ৫ সাইজের Array ডিক্লেয়ার করলাম তখন মেমোরিতে
একদম পাশাপাশি ৫টা মেমোরি ব্লক বুকিং হয়ে যায় Array এর জন্যে ।
a[0] এর ইনডেক্সের address যদি হয় ১০০০ তাহলে এর পরের
a[1] ইনডেক্সের address কত হবে বলতে পারেন ? এটা যেহেতু ইন্টিজার টাইপের Array তাই
প্রত্যেক ইন্ডেক্সের সাইজ হবে ৪(চার) করে
মানে প্রথমটা যদি ১০০০ হয়ে থাকে এর পরেরটা হবে ১০০৪, তারপরেরটা
হবে ১০০৮, তারপরেরটা হবে ১০১২ এভাবে যত সাইজের ডিক্লেয়ার করব তত পর্যন্ত চলতে থাকবে।
এইখানে আমাদের যদি কেউ শুধু প্রথম ইন্ডেক্সের address
(1000) বলে দেয় তাহলে কি আমরা পরের গুলার address বের করতে পারব না?
পারব, শুধু ৪ করে যোগ করে যাব,
সূত্র দিয়েও করতে পারি
কাংক্ষিত address= শুরুর
address + (কাংক্ষিত ইনডেক্স
* 4);
3rd index এর address বের করতে চাই যদি,
3rd index= 1000 + ( 3 *4); =
1012;
যেভাবেই হোক প্রথম ইন্ডেক্সের address জানলে পরের গুলা বের করতে পারি আর কি কারণ, array তে সব মেমোরি ব্লক একসাথে থাকে
তো আমাদের দরকার প্রথম ইন্ডেক্সের address টা শুধু,
Array কে যখন আমরা পয়েন্টারের মধ্যে রাখি তখন শুধু first
index এর address টা ঐ পয়েন্টারের কাছে স্টোর হয়, তারপর ptr++; করে করে আমরা পুরো
Array traverse করতে পারি পয়েন্টারের মাধ্যমে।
পয়েন্ট টু বি নোটেডঃ Array এর প্রথম ইন্ডেক্সের
address শুধু থাকে পয়েন্টারের কাছে
Code:
int a[ ]=
{1,3,14,56,74}; //a নামের int array declare
int *p; //ইন্টিজার
টাইপের পয়েন্টার declare
p=a;
অথবা
p=&a;
অথবা,
p=&a[0];
উপরের ৩টা লাইনের একই মিনিং, Array যেই মেমরিতে যায়গা নিবে
শুধু তার প্রথম ইনডেক্সের address ই রিটার্ন
করবে। মানে উপরের উদাহরন অনুযায়ী p=1000; আসবে, আর তারপরে p++ করলে ১০০৪,১০০৮ ইত্যাদি এভাবে পরের ইন্ডেক্স গুলাও আমরা পেয়ে যায়, তাই কোনো Array কে পয়েন্টারের মধ্যে রাখছি মানেই ঐ Array এর প্রথম index এর address কে রাখায় বুঝাই always.





Comments
Post a Comment