পয়েন্টার

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

পয়েন্টার কথাটা দেখেই আমাদের মনে হচ্ছে সে কোন কিছুকে পয়েন্ট করবে। আসলে ব্যাপারটা এই রকম ই সে কোন একটা কিছু কে পয়েন্ট করবে। এই কোন একটা কিছু হচ্ছে একটা নির্দিষ্ট ভ্যারিয়েবলের অ্যাড্রেস (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) assign করা হয়েছে এখন ও পয়েন্ট করা হয়নাই।
 এখানে number1 এর মধ্যে যে number এর শুধু (address)বা ঠিকানা assign হচ্ছে তা বুঝার জন্যে নিচের প্রোগ্রামটি লক্ষ্য করি।‪

#include<stdio.h>
int main()
{
    int *number1,number;
    number1 = &number;
    printf("%d %d \n",&number,number1);
    return 0;
}

এই প্রোগ্রামটি রান করলে আমরা দুইটা একই মান পাব। দুইটা একই মান পাওয়া কখন সম্ভব?
অবশ্যই যখন &number ও number1 এর মান একই হবে তখনি কেবল একই মান টা পাওয়া সম্ভব।
এখানে আসলে 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 কে pointer এ assign করেছি। পরের স্ট্যাটম্যান এ var এর মান 10 assign করেছি।
তারপরে আমরা তা প্রিন্ট করেছি। প্রোগ্রামটি রান করলে দেখব var এবং *pointer এর মান একই আসছে। তাহলে আমরা এখন লজিক্যালি বলতে পারি যে var এবং *pointer দুইটা জিনিস একই এই প্রোগ্রামটিতে। আমরা যদি এদের যেকোন একটার মান পরিবর্তন করি তাহলে দুইটার মান ঐ পরিবর্তন হবে।
আসলে আমরা *pointer এটা দ্বারা কি বুঝতেছি?
এখানে pointer এর মধ্যে var এর address কে রাখা হয়েছে। এখানে যখনি আমরা (*) অপারেটর দিয়ে pointer কে পয়েন্ট করছি তার মানে var এর address কেই পয়েন্ট করছি। কেননা pointer এর মধ্যে var এর address কেই assign করা হয়েছে ।
 অর্থাৎ আমরা বলতে পারি যে

*pointer == *(&var);

এখন একটি গুরুত্বপূর্ন কথা হচ্ছে আসলে আমরা তাহলে *pointer দ্বারা কি বুঝতেছি?
*pointer দ্বারা আমরা বুঝতেছি যে pointer এর মধ্যা যার address কে assign করা হবে সেই 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 nasim,*Nasim;
Nasim = &nasim;
*(&(*(&nasim))) == nasim == *Nasim;
উপরের স্ট্যাটম্যান্টগুলো সত্য একটু মাথা ঘামালেই তা বুঝতে পারার কথা।
নিচের এই প্রোগ্রামটিতে  পয়েন্টার সম্পর্কে ভাল ধারণা দিবে।

#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;
}

বৃত্তের ক্ষেত্রফল নির্ণয় করার প্রোগ্রাম।

No comments

Powered by Blogger.