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

0
247

স্ট্রাকচার ও পয়েন্টার

সি ল্যাঙ্গুয়েজে স্ট্রাকচারের মাঝে পয়েন্টারের ব্যবহারের সুবিধাও রয়েছে। প্রোগ্রামে যে নিয়মে সাধারণ পয়েন্টার ব্যবহার করা হয়, সেই একই নিয়মে স্ট্রাকচারের মাঝেও পয়েন্টার ব্যবহার করা যাবে। যেমন :
struct student
{
char* name;
}*data,info;

এখানে প্রথমে স্ট্রাকচারের ভেতরে ক্যারেক্টার পয়েন্টার ভেরিয়েবল নেম ডিক্লেয়ার করা হয়েছে। পরে ওই স্ট্রাকচারের একটি পয়েন্টার ভেরিয়েবল ডাটা ডিক্লেয়ার করা হয়েছে। অর্থাৎ স্ট্রাকচারের যেকোনো জায়গায় ব্যবহারকারী চাইলে পয়েন্টার ডিক্লেয়ার করতে পারেন।

স্ট্রাকচারের ক্ষেত্রে পয়েন্টার নিয়ে কাজ করলে তাকে অ্যাক্সেস করার নিয়মে একটু ভিন্ন রকম হয়। যেমন : কোনো পয়েন্টেড ভেরিয়েবলের মেম্বার নিয়ে কাজ করার সময় মেম্বার অপারেটর ব্যবহার না করে অ্যারো অপারেটর নিয়ে কাজ করতে হয়। অর্থাৎ সে ক্ষেত্রে মেম্বার ভেরিয়েবলের সিনটেক্স হবে :
pointer_variable_name ® member_name;

যেমন উপরের পয়েন্টার স্ট্রাকাচারের একটি পয়েন্টার মেম্বারকে যদি প্রিন্ট করতে হয়,

data=&info;
printf(“%s”,data®name);

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

স্ট্রাকচার ভেরিয়েবল ও স্ট্রাকচার পয়েন্টারের পার্থক্য

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

একটি স্ট্রাকচারের পয়েন্টারের জন্য সবসময় ২ থেকে ৪ বাইট জায়গা নির্ধারিত হয়। পয়েন্টারটি যদি মেম্বার পয়েন্টার হয়, তাহলেও একই নিয়ম প্রযোজ্য। কিন্তু একটি স্ট্রাকচারের বেলায় ওই স্ট্রাকচারের মেম্বারগুলো নির্ভর করে স্ট্রাকচার ভেরিয়েবলটি মেমরিতে কতটুকু জায়গা দখল করবে। স্ট্রাকচার পয়েন্টার যেহেতু আসলে একটি পয়েন্টার মাত্র, তাই এর নিজের কোনো মেম্বার থাকা সম্ভব নয়। কিন্তু এর মাধ্যমে অন্য কারও মেম্বারকে অ্যাক্সেস করা সম্ভব। কোনো স্ট্রাকচার পয়েন্টার দিয়ে যদি কোনো স্ট্রাকচারকে আগে পয়েন্ট করা হয়, তাহলেই শুধু পরে ওই পয়েন্ট করা স্ট্রাকচার ভেরিয়েবলের মেম্বারকে অ্যাক্সেস করা যাবে। আর স্ট্রাকচারের মেম্বারকে অ্যাক্সেস করতে হলে মেম্বার অপারেটর ব্যবহার করতে হয়, কিন্তু যখন পয়েন্টার দিয়ে মেম্বারকে অ্যাক্সেস করার দরকার হবে, তখন অ্যারো অপারেটর ব্যবহার করতে হবে। একটি স্ট্রাকচার ভেরিয়েবলের মাঝে বিভিন্ন ধরনের ডাটা থাকে, কিন্তু একটি পয়েন্টারের মাঝে সবসময় শুধু অ্যাড্রেসই থাকবে। এ কারণেই পয়েন্টার শুধু ২ বাইট অথবা কম্পাইলার বিশেষে ৪ বাইট জায়গা নেয়। কারণ মেমরির অ্যাড্রেস ধারণ করতে সাধারণত ৪ বাইটের বেশি দরকার হয় না।

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