সি/সি++ প্রোগ্রামিং টিউটোরিয়াল (পর্ব ১৬) পয়েন্টার এবং অ্যারের মাঝে সম্পর্ক ও পার্থক্য

0
230

পয়েন্টারের পয়েন্টার

আমরা জানি, পয়েন্টার হলো একটি বিশেষ ধরনের ভেরিয়েবল, যা অন্য ভেরিয়েবলকে পয়েন্ট করে বিভিন্ন কাজে বিভিন্নভাবে ব্যবহার করে। ভেরিয়েবল যেমন বিভিন্ন টাইপের হয়, তেমনি পয়েন্টারও ইন্টিজার, ডাবল ইত্যাদি টাইপের হয়। যেমন int *i; এখানে i একটি পয়েন্টার, যা ইন্টিজার টাইপের ভেরিয়েবলকে পয়েন্ট করতে সক্ষম। এভাবে প্রোগ্রামে যেমন বিভিন্ন ভেরিয়েবলের জন্য পয়েন্টার ডিক্লেয়ার করা যায়, তেমনি বিভিন্ন পয়েন্টারের জন্যও পয়েন্টার ডিক্লেয়ার করা যায়। অর্থাৎ এক্ষেত্রে পয়েন্টার কোনো ভেরিয়েবলকে পয়েন্ট করবে না, বরং অন্য একটি পয়েন্টারকে পয়েন্ট করবে। যেমন int **p; এখানে p হলো একটি ইন্টিজার টাইপের পয়েন্টারের পয়েন্টার। অর্থাৎ p দিয়ে এমন পয়েন্টারকে পয়েন্ট করা যাবে, যা কি না কোনো ইন্টিজারকে পয়েন্ট করে।

আবার char **c; এখানে c হলো একটি ক্যারেক্টার টাইপের পয়েন্টারের পয়েন্টার। লক্ষণীয়, একটি নির্দিষ্ট টাইপের ভেরিয়েবলকে যতগুলো ভেরিয়েবল পয়েন্ট করবে, এদের সবই একই টাইপের হতে হবে (ব্যতিক্রম ভয়েড টাইপ)। এমন কোনো পয়েন্টার হয় না যেটি নিজে ইন্টিজার টাইপের, কিন্তু পয়েন্ট করছে ডাবল টাইপের একটি পয়েন্টারকে। এভাবে একাধিক * সাইন ব্যবহার করে প্রয়োজনমতো পয়েন্টার বানিয়ে নেয়া যায়। যেমন int ***p; এখানে তিনটি * সাইন ব্যবহার করা হয়েছে। যার অর্থ p এমন একটি পয়েন্টার, যা ইন্টিজার টাইপের ভেরিয়েবলের পয়েন্টারের পয়েন্টারকে পয়েন্ট করে।

পয়েন্টার ও অ্যারে

সি-তে পয়েন্টার ও অ্যারের মাঝে একটি ঘনিষ্ঠ সম্পর্ক রয়েছে। অ্যারের অনেক কাজই পয়েন্টারের মতো। আবার পয়েন্টারের গঠন অনেকটা অ্যারের মতো বলা যায়। অ্যারে নিয়ে আগের সংখ্যায় আলোচনা করা হয়েছে। তবে পয়েন্টার ও অ্যারে নিয়ে আলোচনা করার জন্য অ্যারের সব ফিচার মনে রাখতে হবে। তাই আগে অ্যারে সম্পর্কে সংক্ষিপ্ত ধারণা দেয়া হলো।

অ্যারে সম্পর্কে সংক্ষিপ্ত ধারণা

অ্যারে মূলত হাই লেভেল ল্যাঙ্গুয়েজের অন্যতম ফিচার এবং এটি সি-এর অন্যতম প্রধান ফিচারগুলোর একটি। অ্যারে কী তা বোঝার জন্য একটু পেছনে ফিরে যেতে হবে। আমরা জানি, সি-তে ভেরিয়েবল ডিক্লেয়ার করা যায়। ভেরিয়েবল কী, তা ডিক্লেয়ার করলে কী হয় এবং তা কীভাবে কাজ করে তাও আমরা জানি। অ্যারের মূল ধারণা নতুন কিছুই নয়। অ্যারে হলো অনেকগুলো ভেরিয়েবল একসাথে ডিক্লেয়ার করার একটি পদ্ধতি। ধরুন, কোনো প্রোগ্রামে একইসাথে পাঁচটি ভেরিয়েবল ডিক্লেয়ার করার প্রয়োজন হলো। তাহলে ব্যবহারকারী সাধারণ নিয়মে পাঁচটি ভেরিয়েবল ডিক্লেয়ার করতে পারেন। এজন্য পাঁচটি স্টেটমেন্ট লেখার প্রয়োজন হবে, আবার একটি স্টেটমেন্টেও পাঁচটি ভেরিয়েবল ডিক্লেয়ার করা যায়। কিন্তু সেক্ষেত্রে স্টেটমেন্টটি অনেক বড় হবে। কিন্তু অ্যারে ব্যবহার করে পাঁচটি ভেরিয়েবল একই সাথে অর্থাৎ একটি স্টেটমেন্ট দিয়েই ডিক্লেয়ার করা সম্ভব।

মাত্র পাঁচটি ভেরিয়েবলের ক্ষেত্রে হয়তো এটি তেমন গুরুত্বপূর্ণ বিষয় নয়, কিন্তু অনেক বড় প্রোগ্রামে একইসাথে যখন ১০০ বা ১০০০ ভেরিয়েবল ডিক্লেয়ার করার প্রয়োজন হবে, তখন অ্যারে ব্যবহার করলে কোডিং অনেক সহজ হয়ে যায়। অ্যারে হলো কতগুলো ভেরিয়েবলের সমষ্টি। সুতরাং ভেরিয়েবল ডিক্লেয়ারের মতো করেই অ্যারে ডিক্লেয়ার করতে হয়। ভেরিয়েবল ডিক্লেয়ারের আগে যেমন ডাটা টাইপ লেখার দরকার, অ্যারের জন্যও তেমনি দরকার। অ্যারে ডিক্লেয়ার করার সিনটেক্স : data_type array_name[array_size]| অ্যারের নাম হলো যেকোনো ভেরিয়েবলের নাম। অর্থাৎ ভেরিয়েবলের নামের নিয়মানুসারে অ্যারের নাম করতে হবে। এখানে নতুন বিষয় হলো অ্যারে সাইজ। যেহেতু অ্যারে হলো অনেকগুলো ভেরিয়েবলের সমষ্টি।

সুতরাং কতগুলো ভেরিয়েবল নিয়ে অ্যারে ডিক্লেয়ার করা হচ্ছে সেটা বলতে হবে। এটিই হলো অ্যারে সাইজ। সাইজ যত হবে ততগুলো ভেরিয়েবল নিয়ে অ্যারে গঠিত হবে। অ্যারে ও ভেরিয়েবল ডিক্লেয়ারের মাঝে মূল পার্থক্য হলো সাইজ। যেমন int prime[10], valid[5]; ইত্যাদি। এখানে একই সাথে প্রাইম নামে দশটি, ভ্যালিড নামে পাঁচটি ইন্টেজার ডিক্লেয়ার করা হয়েছে। আর প্রাইম নামে যে ১০টি ভেরিয়েবল ডিক্লেয়ার করা হয়েছে তাদের আলাদাভাবেও অ্যাক্সেস করা যাবে। সেক্ষেত্রে prime[0], prime[1], prime[2] ইত্যাদি হবে একেকটি ভেরিয়েবলের নাম। প্রাইম নামের পর যে [] বন্ধনীর ভেতরে সংখ্যা ব্যবহার করা হয়েছে তাকে অ্যারের এলিমেন্টের ইন্ডেক্স বলে। এটি দিয়ে একটি অ্যারের সব এলিমেন্টকে অ্যাক্সেস করা যায়। অ্যারের ইন্ডেক্সিং ০ থেকে শুরু হয়।

পয়েন্টার বিভিন্ন ধরনের হয় এবং এদের কাজও বিভিন্ন ধরনের। যেমন শুধু কনস্ট্যান্ট পয়েন্টার ব্যবহার করেই ফাইল রিড অনলি হবে কি না তা নিয়ন্ত্রণ করা যায়। এ ধরনের প্রতিটি পয়েন্টারেরই নির্দিষ্ট ব্যবহার রয়েছে।

একটি উত্তর ত্যাগ