Pointer in C

আমরা সাধারণত পয়েন্টার কাকে বলি ??
যে কাউকে পয়েন্ট করে তাকে ।
সি তেও পয়েন্টার এর একি কাজ । পয়েন্টার এখানে পয়েন্ট করে কোন variable কে ।
পয়েন্টার নিজেও এক ধরনের variable । এদেরকে পয়েন্টার variable বলে ।
নরমাল variable এর মধ্যে থাকে কোন value । যেমন ঃ 1,2,3,4,A,B,C,D ইত্যাদি ।
কিন্তু pointer variable এর মধ্যে থাকে memory address ।
pointer variable এর আগে * sign দিয়ে একে প্রকাশ করা হয় ।


এখন তাহলে প্রশ্ন আসতে পারে কিসের মেমরি এড্রেস ?

একটা পয়েন্টার variable এ থাকে ওই পয়েন্টার variable যাকে points করতেছে তার memory address ।
ধরি , int x একটা variable declare করলাম । তাহলে এটি memory তে একটা এড্রেস নিবে । যেহেতু random address নিবে, তাই আমরা বলতে পারই না , এই x variable এর এড্রেস কত । কিন্তু pointer এর মাধ্যমে তা আমরা বের করতে পারি ।


আমরা যখন কোন variable এর ইনপুট নেই তখন লিখি
scanf("variable_type",&variable_name);
এখানে & sign দিয়ে এড্রেস বুঝানো হয়েছে । অর্থাৎ, উপরের লাইনটির মানে আমি ইনপুট দেওয়া value টা x variable এর address এ রাখতে চাই ।
এবার দেখি pointer variable এর ভেতর কিভাবে কোন variable এর মেমোরি এড্রেস রাখা যায় ।
কাজ টা খুবই সহজ,

int x,*p;
p=&x;

এখানে x সাধারণ একটা variable আর p একটা pointer variable ।
২য় লাইনে x variable এর মেমোরি এড্রেস p এ assign করা হয়েছে ।


উপরের ছবিতে , b একটি pointer variable ।
৬ষ্ঠ লাইনে a variable এর মেমোরি এড্রেস p এর মধ্যে রাখা হয়েছে ।
আবার ৭ম লাইন a variable এর মেমোরি এড্রেস b এর মধ্যে রাখা হয়েছে ।
এখন এই দুটির মধ্যে পার্থক্য কি ??
b, a এর মেমরি এড্রেসকে পয়েন্ট করছে , কিন্তু p এ a এর memory address আছে একটা value হিসেবে ।
৯ম ও ১১তম লাইনে p+1 এবং b+1 করা হয়েছে ।
output দেখুন p এর value এক বেড়েছে । কিন্তু b এর value 4 বেড়েছে ।
ভাবছেন দুটির ত একি result হওয়ার কথা কিন্তু আলাদা আসল কেন ??
p এর ক্ষেত্রে a এর মেমোরি এড্রেস সাধারণ একটা value হিসেবে ছিল তাই সাধারণ গাণিতিক হিসেবে এক মান বেড়েছে । কিন্তু b এর ক্ষেত্রে ছিল a এর মেমোরি এড্রেস হিসেবে তাই এর মান এড্রেস হিসেবে বেড়েছে । int এর ক্ষেত্রে একটা int variable মেমোরিতে 4 byte জায়গা নেয় । তাই x এর মেমোরি এড্রেস যদি হয় 120 তাহলে এর পরের তা হবে 124 । এই হিসেবে উপরে b এর মান 4 বেড়েছে ।
[ topic টা জটিল কইরা ফালাইতেছি মনে হয় O.o :( ]
আচ্ছা নিছের ছবিটা দেখি ।
ধরি, একটা array এর মধ্যে কত গুলা value input নিব ।
ধরলাম, array টা int x[5];
এর memory address,inputted value, index value নিম্নরূপ ঃ
এখন a একটা পয়েন্টার variable নিলাম ।
a=x;
এতে a variable x arrary র প্রথম ঘর x[0] কে পয়েন্ট করবে ।
** index indicate করে না দিলে পয়েন্টার array র প্রথম ঘরটিকে পয়েন্ট করে।
 এছাড়া index উল্লেখ্য করে আমরা একটা নির্দিষ্ট ঘরকে indicate করতে পারি । যেমন ঃ
a=x[3];
এবার একটা কোড দেখি, কিভাবে pointer ব্যবহার করে একটা word কে reverse করা যায় ।


pointer variable এর ক্ষেত্রে শুধু variable এর নাম লিখা মানে তার memory address বুঝায় । কিন্তু *variable_name মানে তার মধ্যে থাকা value কে বুঝায় ।



হুম , string তো reverse হল । এবার function এ পয়েন্টার নিয়ে একটু কাজ করি । :D
মজাই তাই না ?? :D
আচ্ছা সাধারণত আমরা একটা function থেকে একটা value return করতে পারি । কিন্তু যদি এমন হয় একাধিক value return করতে হবে তখন !!
চিন্তার কিছু নাই , এইটা করা যাবে pointer দিয়ে । :D
ধরুন ২টা নাম্বার function এর মাধ্যমে swap করতে হবে । তো দেখি কিভাবে করা যায় ।



উপরের কোডে a এবং b দুইটা variable নিলাম । তারপর swap() function এর মাধ্যমে তা swap করছি ।
swap() function এ কি কি কাজ করলাম সেইটা একটু দেখি ।
১৮ নাম্বার লাইনে main() function থেকে swap() function এ a এবং b variable এর value পাঠালাম । অবাক হচ্ছেন ?? যে value পাঠাতে &a,&b কেন লিখলাম !! value তো a,b লিখলেই চলে যেত । :)
হুম, আপনার ধারনা ঠিক । আসলে এখানে আমরা a,b variable এর value না পাঠিয়ে a,b memory address পাঠিয়েছি । আর তার জন্যই &a,&b লিখেছি ।
আচ্ছা এটা না হয় বুঝলাম তাই ভাই value receive করার ওখানে *a,*b কেন দিছেন :/
হুম আসলেই চিন্তার বিষয় । কেন এটা করালাম !!
দেখুন যখন আমরা কোন variable এর value পাঠাতাম তখন a,b লিখেই আমরা value receive করতাম । কিন্তু এখানে কি আমরা variable এর value পাঠিয়েছি ?? না, এখানে আমরা variable এর memory এড্রেস পাঠিয়েছি । আর তা receive করার জন্যই *a,*b লিখেছি ।
অর্থাৎ, ৫ নাম্বার লাইনে void swap(int *a,int *b)
এখানে a এবং b দুইটা pointer variable । যার মধ্যে main function এর a এবং b এর memory address রেখেছি । আচ্ছা আর একটা ব্যাপার হল main() function এর a,b আর swap() function এর a,b কিন্তু এক না । সম্পূর্ণ আলাদা দুইটা variable ।
এরপর swap function এর ভিতর ( ৮ - ১০ নাম্বার লাইন ) swap করছি ।

আউটপুট ঃ

এবার দেখি কেন এখানে আমারা pointer দিয়ে কিজা করলাম । ধরুন , pointer এর মাধ্যমে এড্রেস না পাঠিয়ে শুধু value পাঠালাম । তারপর তা swap করলাম । তাহলে রেজাল্ট টা কি হত ।


দেখুন a,b এর value swap() function এ swap হয়েছে কিন্তু main() function এ কি change হয়েছে ? হয় নাই :( কিন্তু আমাদের তো মেইন function এ swap হওয়া দরকার ।
আগেই বলেছিলাম main function এর a,b আর swap function এর a,b এক না তাই a,b এর value swap() function এ swap হলেও main function এ swap হয়নি । কিন্তু pointer দিয়ে করলে  swap() function এ main function এরই value swap হয়েছে । কারণ এক্ষেত্রে আমরা swap function এ value নিয়ে কাজ না করে main() function এর a,b এর memory address নিয়ে কাজ করছি । তাই swap() function এ main() function এরই value swap হয়েছে । :)

জিনিস টা মনে হয় একটু জটিল হয়ে গেসে । ব্যাপার না কারো বুঝতে সমস্যা হলে কমেন্ট করবেন ,ও আরও একটু সহজ করার চেষ্টা করব :)

Share this

Related Posts

Previous
Next Post »

6 মন্তব্য

মন্তব্য
২ জুন, ২০১৩ ২:২৫ AM delete

খুব সুন্দর পোস্ট এর জন্য অনেক ধন্যবাদ আপনাকে।

Reply
avatar
২ জুন, ২০১৩ ২:৩৯ PM delete

আপনাকেও অসংখ্য ধন্যবাদ কষ্ট করে পড়ার জন্য :D

Reply
avatar