পয়েন্টার শব্দটি নিশ্চয়ই তোমরা অনেকবার শুনেছ। অনেকে হয়তো তোমাদের ভয় দেখিয়েছে যে পয়েন্টার খুব কঠিন জিনিস। একবার তো কোনো এক বইতে এমনও লেখা দেখেছিলাম যে, একজন ভালো সি প্রোগ্রামার হচ্ছে সেই ব্যক্তি, যে পয়েন্টার ছাড়া বাকি সব কিছু ভালো বোঝে! কি, ভয় পেয়ে গেলে? পয়েন্টার মোটেও ভয়ের কোনো বিষয় নয়। তুমি নিশ্চিত থাকতে পারো যে, তুমি এতক্ষণে পয়েন্টার বোঝার জন্য তৈরি হয়ে গিয়েছ এবং এই অধ্যায়টি ঠিকভাবে পড়লে, উদাহরণগুলো নিজে করলে আর যেসব কাজ করতে বলব, সেগুলো মন দিয়ে করলে, পয়েন্টার তুমি হরহামেশাই ব্যবহার করতে পারবে।
আলোচনা করার আগেই আমরা, চল, নিচের প্রোগ্রামটি লিখে কম্পাইল ও রান করি। তোমরা অনেকেই হয়তো বইটি পড়ার সময় আমার কথা মতো প্রোগ্রাম টাইপ করা, কম্পাইল করা ও রান করার কাজটি করছ না, তাদের কিন্তু শেখাটা ঠিকঠাক হবে না। নিজে হাতেকলমে কাজ করা ও সঙ্গে সঙ্গে চিন্তা করে শেখার চাইতে ভালো পদ্ধতি আর নেই।
প্রোগ্রামটি রান করলে আউপুট দেখবে এমন :
Value of x is 10 Address of x is 0x0060FF0C
তাহলে আমরা দেখতে পাচ্ছি x-এর একটি মান আছে, আর আছে অ্যাড্রেস বা ঠিকানা। আমরা আগের অধ্যায়েই ব্যাপারটি জেনেছি। এখন আমরা যদি ভ্যারিয়েবলের মান নিয়ে কাজ করার বদলে তার ঠিকানা নিয়ে কাজ করতাম, তাহলে কেমন হতো? তোমাদের মনে প্রশ্ন আসতে পারে, ভ্যারিয়েবলের ঠিকানা নিয়ে কাজ করার দরকার কী? এতদিন পর্যন্ত তো মান দিয়েই ঠিকঠাক প্রোগ্রাম লিখে এসেছি। আসলে দরকার আছে, কিন্তু বিষয়গুলো ঠিক এখনই বুঝবে না, পরে বুঝবে। আমি এখন বোঝানোর চেষ্টা করলে তোমরা ভুল বুঝবে, তাই ভুল বোঝার চেয়ে না বোঝা ভালো। আপাতত জেনে রাখো যে, এটি একটি গুরুত্বপূর্ণ বিষয়।
পয়েন্টার হচ্ছে একটি বিশেষ ধরনের ভ্যারিয়েবল যেটি আরেকটি ভ্যারিয়েবলের ঠিকানা রাখতে পারে। ইন্টিজার টাইপের ভ্যারিয়েবলের জন্য ইন্টিজার টাইপের পয়েন্টার ব্যবহার করতে হয়, ক্যারেক্টার টাইপের ভ্যারিয়েবলের জন্য ক্যারেক্টার টাইপের পয়েন্টার, ডবল বা ফ্লোটের জন্য সেই টাইপের পয়েন্টার।
নিচের প্রোগ্রামটি লিখে কম্পাইল ও রান করে দেখো:
প্রোগ্রামটি রান করলে এরকম আউটপুট পাবে:
10 Value of p is 0x0060FF08
লক্ষ কর, int *p; স্টেটমেন্ট ব্যবহার করে আমরা একটি ইন্টিজার টাইপের পয়েন্টার ডিক্লেয়ার করলাম যার নাম p। p-তে আমরা ইন্টিজার টাইপের ভ্যারিয়েবলের ঠিকানা রাখতে পারব। সেটিই আমরা করেছি p = &x; লাইনে। x নামক ইন্টিজার ভ্যারিয়েবলের ঠিকানা আমরা p-তে রাখলাম। এখন p-এর মান প্রিন্ট করলে আমরা x-এর ঠিকানা পাব। আর x-এর মান পাওয়ার জন্য কী ব্যবস্থা? সেটি হচ্ছে *p প্রিন্ট করা। ওপরের উদাহরণটি যদি তোমরা টাইপ করে থাক, তাহলে তোমার কম্পিউটার স্ক্রিনের দিকে আবার লক্ষ কর এবং বিষয়টি তোমার কাছে পরিষ্কার হয়েছে কি না দেখো, আর যারা প্রোগ্রাম নিজে টাইপ করে কম্পাইল ও রান করছ না, তাদের জন্য সমবেদনা রইল।
এখন আমরা একটি পরীক্ষামূলক প্রোগ্রাম লিখব। আমি তো একটু আগে বলেছি যে ভ্যারিয়েবল যে টাইপের হবে, পয়েন্টারও সে টাইপের হতে হবে। সেটি না হলে কী হবে? বেশি চিন্তা না করে প্রোগ্রাম লিখে দেখি।
প্রোগ্রাম কম্পাইল করতে গেলে কম্পাইলার তোমাকে এই বার্তা দিয়ে সতর্ক করে দিবে :
warning: incompatible pointer types assigning to 'int *' from 'double *'
অথবা এরকম এরর দিবে:
error: cannot convert 'double*' to 'int*' in assignment
এখন আমরা আরেকটি কাজ করব। একটি ইন্টিজার টাইপের পয়েন্টারে ইন্টিজার ভ্যারিয়েবলের ঠিকানা রাখব, তারপর পয়েন্টারের মান পরিবর্তন করে দিব। তাহলে দেখা যাবে মূল ভ্যারিয়েবলের মান পরিবর্তন হয়ে গিয়েছে।
আউটপুট হবে এরকম:
Value of x: 10Value of x: 20Address of x: 0x0060FF08Value of p: 0x0060FF08
আর হ্যাঁ, অ্যাড্রেস কিন্তু তোমার কম্পিউটারে অন্যরকম আসবে, তবে দুটি অ্যাড্রেস সমান হবে।
তো এরকম কেন হলো? x-এর মান কেন পরিবর্তিত হলো? এমনটিই তো হওয়ার কথা। আমি তো p পয়েন্টারে x-এর ঠিকানা রেখেছি আর তারপর *p = 20; (পড়ব content of p = 20) লিখেছি, অর্থাৎ আমি p পয়েন্টারে যেই ঠিকানা আছে, সেই ঠিকানায় যেই ভ্যারিয়েবল আছে, সেখানে 20 অ্যাসাইন করেছি। তাই x-এর মান এখন 20। আমি যদি তোমাকে বলি যে, দ্বিমিক কম্পিউটিংয়ের অফিসে একটি বই পৌঁছে দিতে, তাহলে তুমি সেটি করতে পারবে কারণ তুমি হয়তো নিজেই সেই অফিস চেন কিংবা তোমার বন্ধুদের কাছে খোঁজখবর নিয়ে অফিসটি চিনে নিতে পারবে। আর আমি যদি তোমাকে বলি ফ্ল্যাট নম্বর w, বাসা নম্বর x, সড়ক নম্বর y, এলাকার নাম z, তাহলেও কিন্তু তুমি সঠিক জায়গায় যেতে পারবে, এটি দ্বিমিকের অফিস কি না সেটি তোমার না জানলেও চলবে।
আরেকটি উদাহরণ দিই। ধরা যাক, তোমার ক্লাসে রোল নম্বর 25। যখন শিক্ষক তোমার নাম ধরে ডাক দেন, তখন তুমি দাঁড়াও। আবার তোমার রোল নম্বর ধরে ডাক দিলেও তুমি দাঁড়িয়ে যাও। তাহলে তুমি যদি কোনো ভ্যারিয়েবল হও, তোমার ঠিকানা হচ্ছে তোমার রোল নম্বর। বুঝতে পারলে?
প্রোগ্রামিংয়ে কী করলে কী হয়, সেটি বোঝার সহজ উপায় হচ্ছে নিজে প্রোগ্রাম লিখে রান করানো। তাই তোমরা এখন নিচের প্রোগ্রামটি লিখে কম্পাইল ও রান করাবে। আউটপুট কী হবে, কেন হবে, সেগুলো আমি আর বিস্তারিত বলে দিলাম না। নিজেরা চিন্তা করে বুঝে নাও।
এখন একটু ভাষার চর্চা করি। পয়েন্টার (pointer) মানে হচ্ছে যে পয়েন্ট (point) করে। পয়েন্ট করা মানে নির্দেশ করা (প্রয়োজন হলে ইংরেজি থেকে বাংলা অভিধান দেখে নিতে পারো)। আর আমাদের সি প্রোগ্রামিং ভাষায় যে পয়েন্টার, সে একটি ভ্যারিয়েবলের ঠিকানা রাখবে এবং তার আগে * চিহ্ন বসিয়ে সেই ভ্যারিয়েবলের মানও পাওয়া যাবে। p-তে যদি আমি x নামক ভ্যারিয়েবলের ঠিকানা রাখি, তবে x-এর মান x ব্যবহার করেও পাওয়া যায়, আবার *p ব্যবহার করেও পাওয়া যায়। *p ব্যবহার করে x-কে একসেস করার পদ্ধতিকে বলে ডিরেফারেন্সিং (dereferencing)।
বিশেষ দ্রষ্টব্য: এই লেখাটি "কম্পিউটার প্রোগ্রামিং দ্বিতীয় খণ্ড" বইয়ের তৃতীয় অধ্যায় (পয়েন্টার)-এর অংশবিশেষ।
নিচের ছবিতে ক্লিক করে বইটি সম্পর্কে আরো জানা যাবে :
কোন মন্তব্য নেই:
একটি মন্তব্য পোস্ট করুন
এখানে বিষয়সংশ্লিষ্ট মন্তব্য কিংবা প্রশ্ন করা যাবে। বাংলায় মন্তব্য করার সময় বাংলা হরফে লিখতে হবে। আর রোমান হরফে লিখলে ইংরেজিতে লিখতে হবে। নতুবা মন্তব্য প্রকাশ করা হবে না। ধন্যবাদ।