Pointer

পয়েন্টার

পয়েন্টার সম্পর্কে আমার সল্প জ্ঞান তবুও কিছু লিখতে ইচ্ছে হচ্ছে। সাধারনত আমাদের পয়েন্টার নিয়ে একটা ভয় কাজ করে এটা আবার কোন জিনিস আবার এই পয়েন্টার এর কাজ কি? পয়েন্টার না ব্যাবহার করলেও ত আমরা প্রবলেম সল্ভ করতে পারি। কিন্তু আমাদের মনে রাখা উচিৎ যে আমাদের জানতে হবে শূধু জানতে।।। এছারা পয়েন্টার এর অনেক কাজ আছে তা না থাকলে এই অপশনটি কখনোও থাকতনা। প্রথমে এই কথাটার উপর নিজের মন ইস্থির রেখে পয়েন্টার সম্পর্কে জানার চেস্ট্রা করি।

আচ্ছা এত কথা না বলে পয়েন্টার কি তা কিভাবে ব্যাবহার করতে হই তা দেখা যাক।

পয়েন্টার কথাটা দেখেই আমাদের মনে হচ্ছে সে হইত কোন কিছুকে পয়েন্ট করবে। আসলে ব্যাপারটা এই রকমি সে কোন একটা কিছু কে পয়েন্ট করবে। এই কোনএকটা কিছু হচ্ছে একটা নির্দিষ্ট ভ্যারিয়েবলের অ্যাডররেস (address)। আমরা অ্যাডররেস (address)বলতে কি বুঝি সাধারনত কোন ঠিকানা? হ্যা কোন ঠিকানাই বুঝি।আমরা যখন কোন ভ্যারিয়েবল ঘোষনা করি তখনি সেই ভ্যারিয়েবলের জন্যে কম্পিউটারের ম্যামরিতে নির্দিষ্ট একটা অ্যাডররেস (address)তার জন্যে বরাদ্দ করা হয়। এই অ্যাডররেস(address) কে পয়েন্ট করার জন্যেই আমরা সাধারনত পয়েন্টার ব্যাবহার করি। এবং এই অ্যাডররেস(address)কে নিয়ে আমরা সেই ভ্যারিয়েবলের বিভিন্ন কাজ সম্পাদন করতে পারি।

এখন আমরা দেখব যে কিভাবে পয়েন্টার ঘোষনা করতে হয়।এটা করার জন্যে আমাদের প্রথমেই জানতে হবে আমরা কাকে পয়েন্ট করব সে কোন ধরনের(type)।অর্থাত আমরা যাকে পয়েন্ট করতে চাচ্ছি আমাদের অবশ্যই সেই ধরনেরঐ একটা পয়েন্টার নিতে হবে। পয়েন্টার ঘোষনা করার তিন টা নিয়ম আছে তা নিম্নে দেওয়া হল।


(type) *pointername;
 (type)* pointername;
 (type) * pointername;

এখানে * হচ্ছে পয়েন্টার অপারেটর।এখানে লক্ষনিও যে পয়েন্টার ঘোষনাই তিনটা অংশ আছে। প্রথমত পয়েন্টার টাইপ। পয়েন্টার টাইপ হবে পয়েন্টার যার অ্যাডররেস (address)কে পয়েন্ট করবে ঠিক সেই টাইপের।যেমন

int *number1,number;
 number1 = &number;

*number1 হচ্ছে একটা int type pointer ভ্যারিয়েবল যা int type এর ভ্যারিয়েবলের address কে পয়েন্ট করেছে। এখানে number1 এর মধ্যে মুলত number এর ঠিকানা (address) assaign করা হয়েছে এখন ও পয়েন্ট করা হয়নাই। এখানে number1 এর মধ্যে যে number এর শুধু (address)বা ঠিকানা assaign হচ্ছে তা বুঝার জন্যে নিচের প্রগ্রামটা লক্ষ করি।


#include < stdio.h>

int main()
 {
 int *number1,number;

number1 = &number;

 printf("%d %d \n",&number,number1);

return 0;
 }

এই প্রগ্রামটা রান করলে আমরা দুইটা একই মান পাব। দুইটা একই মান পাওয়া কখন সম্ভব? অবশ্যই যখন &numbernumber1 এর মান একই হবে তখনি কেবল একই মান টা পাওয়া সম্ভব। এখানে আসলে number1 এর মানটা কি? নিশ্চয় number এর (address)বা ঠিকানা ? হ্যা ঠিক তাই।কারন আমরা এই কাজটিই number1 = &number;এই স্ট্যাট্ম্যান দ্বারা করেছি। এজন্যেই আমরা উপরের প্রগ্রামটিতে দুইটা একই মান পেয়েছি। আসলে প্রগ্রামিং শিখতে গেলে এই সমস্থ ছোটখাট বিষয় গুলো সম্পর্কে স্পশট জ্ঞান থাকা অত্যান্ত জরূরি।

আমরা এখন address টিকে পয়েন্ট করব এবং পয়েন্ট করার পরে তা কি ধরনের ব্যাবহার করবে তা আমাদের জানা বা সে সম্পর্কে সঠিক ধারনা রাখা খুব জরুরী। এখন যদি আমরা একটা ভ্যারিয়েবলের address কে পয়েন্ট করি (*) অপারেটর দিয়ে। তা জানতে নিচের প্রগ্রামটা লক্ষ করি।


#include < stdio.h>

int main()
 {
 int *pointer,var;

pointer = &var;

var = 10;

printf("var = %d\n",var);

 printf("*pointer = %d\n",*pointer);

*pointer = 100;

printf("var = %d\n",var);

 printf("*pointer = %d\n",*pointer);

return 0;
 }

আমরা উপরের প্রগ্রামটিতে *pointer এবং var নামে দুইটা ভ্যারিয়েবল ডিক্লেয়ার করেছি। যার মধ্যে একটা int type এর pointer variable এবং int type var variable। আমরা এখানে প্রথমে var এর address কে pointerassaign করেছি। পরের স্ট্যাটম্যান এ var মান 10 assaign করেছি।তারপরে আমরা তা প্রিন্ট করেছি। প্রগ্রামটি রান করলে দেখব var এবং *pointer এর মান একই আসছে। তাহলে আমরা এখন লজিক্যালি বলতে পারি যে var এবং *pointer দুইটা জিনিস একই এই প্রগ্রামটাতে। আমরা যদি এদের যেকোন একটার মান পরিবর্তন তাহলে দুইটার মান ঐ পরিবর্তন হবে।

আসলে আমরা *pointer এটা দ্বারা কি বুঝতেছি?এখানে pointer এর মধ্যে var এর address কে রাখা হয়েছে। এখানে যখনি আমরা (*) অপারেটর দিয়ে pointer কে পয়েন্ট করছি তার মানে var এর address কেই পয়েন্ট করছি। কেননা pointer এর মধ্যে var এর address কেই assaign করা হয়েছে । অর্থাৎ আমরা বলতে পারি যে ,*pointer==*(&var);

এখন একটি গুরুত্বপূর্ন কথা হচ্ছে আসলে আমরা তাহলে *pointer দ্বারা কি বুঝতেছি? *pointer দ্বারা আমরা বুঝতেছি যে pointer এর মধ্যা যার address কে assaign করা হবে সেই address এর মধ্যে যেই মানটা রাখা হবে সেই মানটা। অর্থাৎ *pointer==var;

আসলে আমার কাছে মনে হয় এই বিষয়গুলো স্বাভাবিক ভাবে নিলে আমরা সহজেই পয়েন্টার ব্যাবহার এ খুব দক্ষ হয়ে উঠব ইনশাল্লাহ। নিচের প্রাগ্রামটা দেখি এবং নিজে নিজেই বুঝার চেষ্ট্রা করি। এখন আমরা একটা প্রগ্রাম দেখব।


 #include < stdio.h>

int main()
 {
 int pointed1,pointed2,*pointer1,*pointer2,result;+

pointer1 = &pointed1;

pointer2 = &pointed2;

printf("Please enter Two number for Add\n");

 scanf("%d%d",&pointed1,&pointed2);

result = *pointer1 + *pointer2;

 printf("%d\n",result);

return 0;
 }

এখন কিছু এক্সপ্রেশন দেখি যা অনেক কাজে দিবে।


 int alamin,*Alamin;
 Alamin = &alamin;
 *(&(*(&alamin)))==alamin==*Alamin;

উপরের স্ট্যাটম্যান্টগুলো সত্য একটু মাথা ঘামালেই তা বুঝতে পারার কথা।

নিচের এই প্রগ্রামটা পয়েন্টার সম্পর্কে ভাল ধারনা দিবে যা HSTU এর এক ফ্রেন্ড আমাই দিয়েছিল।


 #include< stdio.h >
 #include< math.h >
#define pi 3.14159
 void area(float *x)
 {
 float area,*y;
 y=&area;
 *y=pi*pow((*x),2);
 printf("%f",*y);
 }
 int main()
 {
 float rad,a;
 scanf("%f",&rad);
 area(&rad);
 return 0;
 }