আলম এবং সেফাত পরস্পর বন্ধু। সেফাতের একটা অভ্যাস হলো আলমের পিছনে গোয়েন্দাগিরি করা। আই মিন, আলম কোথায় যায় কি করে সেই খবর সে রাখে, আরো ছ্যাঁচড়াভাবে বললে পিছে পিছে ঘুরে আর কি। আলম এতে মাইন্ড করেনা কারন সেফাতকে আলম অনেক বিশ্বাস করে নিজের গফের চেয়েও বেশী। তো, তুমি যদি জিজ্ঞেস করো আলম এখন কোথায়? গুলিস্তান, ধোলাইখাল যেখানেই থাকুক না কেন সে হুবহু বলে দিতে পারবে তাইনা? আর তোমাকে বিশ্বাস করানোর জন্য সে আলমকে সাথে নিয়ে সেলফিও তুলে দিতে পারবে। ব্যপারটাই স্বাভাবিক।
মনে করো আলমকে আমি ১০ টাকা দিলাম এবং সেফাতকে আলমের পেছনে লাগায়া দিলাম। সেফাত যেহেতু আলমকে ফলো করে আলমকে দিয়ে আমি সে টাকাটা ফিরিয়ে আনতে পারবো তাইনা? একইভাবে সেফাতকে দিয়ে আমি আলমের কাছে টাকাটা পাঠিয়েও দিতে পারবো।
এখানে আলম একটা ভেরিয়েবল হিসেবে কাজ করছে আর ছ্যাঁচড়া সেফাত পয়েন্টার হিসেবে কাজ করছে। পয়েন্টারের কাজই হলো কোন একটা ভেরিয়েবলকে পয়েন্ট করা/অ্যাড্রেস রাখা/ফলো করা একই কথা। কোন একটা পয়েন্টার যখন কোন একটা ভেরিয়েবলের অ্যাড্রেস রাখে তখন ওই পয়েন্টার সেই ভেরিয়েবলের সমস্ত ইনফরমেশন জানতে পারে।
পয়েন্টার সি প্রোগ্রামিং এর গুরুত্বপূর্ণ এবং শক্তিশালী একটা জিনিস যা সরাসরি মেমরির সাথে জড়িত। এটা দিয়ে অনেক কাজ খুব দ্রুত সময়ে কমপ্লিট করা যায়।
আমরা জানি ভেরিয়েবলের কাজ হলো ডাটা রাখা, যেমন আলম ১০ টাকা রাখছে। পয়েন্টারের কাজ হলো সেই ভেরিয়েবলের অ্যাড্রেস রাখা। কাউকে ফলো করা আর তার অ্যাড্রেস জেনে রাখা একই জিনিস। অনেকে প্রশ্ন করতে পারো ভেরিয়েবলের অ্যাড্রেসটা আবার কি, তাদের জন্য-
আমরা সবাই জানি, ভেরিয়েবল ডিক্লেয়ার করলে সে মেমরিতে একটা যায়গা তৈরী করে নেয় এবং ডাটাটা সেখানে রেখে দেয়। প্রতিটা যায়গারই একটা অ্যাড্রেস থাকে। পয়েন্টার সেই অ্যাড্রেসটাই জমা রাখে। একটা ভেরিয়েবলের সামনে & বসালেই তার অ্যাড্রেস পাওয়া যায়। নীচের প্রোগ্রামে দেখো আলমের কাছ থেকে কিভাবে তার অ্যাড্রেস জানতেছি
এখন যে কাজটা করবো তা হল সেফাতকে আলমের পিছনে লাগায়া দিবো। আই মিন, সেফাতকে বলবো আলমের পিছে পিছে ঘুরতে। সেফাতের কাজই হলো যেহেতু আলমের অ্যাড্রেস জেনে রাখা তাই সেফাতের আগে অবশ্যই * দিতে হবে। ছ্যাঁচড়াদের আইডেন্টিফাই করার জন্য তার আগে স্টেরিক ব্যবহার করতে হয়।
এখন আমরা চাইলে সেফাতের কাছ থেকে জানতে পারবো আলমের কাছে কত টাকা আছে-
আবার যদি চাই আলমের কাছের যে টাকা আছে তা পরিবর্তন করতে সেটা কিন্তু আমরা সেফাতকে দিয়েই করতে পারবো। মনে করো আমি সেফাতকে বললাম আলমের কাছে এখন ২০ রাখো। সেফাত দ্রুত আলমের কাছে গিয়ে ২০ টাকা রেখে দিবো।
দেখতে পাচ্ছো আমরা কিন্তু আলমকে কিছুই বলিনাই। সেফাতরে দিয়ে ঘটনা ঘটিয়ে ফেললাম। অথ্যাৎ, সেফাতকে দিয়ে আলমের ভেলু পরিবর্তন করে ফেললাম। চাইলে কিন্তু আলমের ব্যালান্স শুন্যও করে দিতে পারি। সো, বি কেয়ারফুল।
সেফাত এবং আলমের মধ্যে কিন্তু একটা জিনিসের মিল আছে। তারা কেউ ই একসাথে একাধিক ভেলু রাখতে পারেনা। আলম যেমন একসাথে একাধিক ভেলু রাখতে পারেনা আবার সেফাত একসাথে একাধিক লোককে ফলো করতে পারেনা। সেফাত ডিজিটাল ছ্যাঁচড়া। একসাথে একাধিক মানুষের সাথে চামচামি সে একদমই পছন্দ করেনা। তো, কোনভাবে সেফাতকে যদি কেকা নামের একজন ব্যাক্তির অ্যাড্রেস ধরায়া দিতে পারি তাহলে কিন্তু সে আর আলমকে ফলো না করে কেকাকে ফলো করবে।
সেফাত বড্ড বেড়ে গেছে। যাকে তাকে ফলো করে বসতেছে। তুমি চাইলে কিন্তু সেফাতকে পুরা ডাম্ব করে দিতে পারো। মানে সে কাউকেই ফলো করবেনা। এটা করতে হলে সেফাতকে একটা NULL দিয়ে দাও। ভেজাল শেষ। বিশ্বাস না হলে করে দেখো, সে তোমাকে কোন ভালু বা অ্যাড্রেস কিছুই দিতে পারবেনা।
তুমি কি জানো একটা অ্যারের নাম নিজেই একটা পয়েন্টার? অথ্যাৎ, আমাদের যদি একটা অ্যারে হয় int myArr[] = {50, 60, 70, 80, 90} এখানে myArr হলো একটা পয়েন্টার যার কাছে থাকবে প্রথমজনের অ্যাড্রস। মানে হলো myArr এর কাছে থাকে myArr[0] এর অ্যাড্রেস। বিশ্বাস না হলে *myArr প্রিন্ট করে দেখো তোমার আউটপুট আসবে 50.
এখন সেই অ্যাড্রেসটা যদি সেফাতকে দেখিয়ে দিতে পারি তাহলে কিন্তু সে এবার কেকাকে ভূলে গিয়ে এখানে এসে myArr[0] কে পয়েন্ট করবে। বুঝতেই পারছো সেফাত এখন কোন ভালুটা আউটপুট দিবে।
অ্যারেতে মেমরি ব্লক হিসেবে কাজ করে অথ্যাৎ, সবগুলো ভেরিয়েবল পাশাপাশি যায়গা করে নেয় সেহেতু পয়েন্টারকে এক এক করে বাড়িয়ে আমরা সবগুলো ভেলু এক্সেস করতে পারি। যেমন, সেফাতকে এক বাড়ালে সে পরের অ্যাড্রেসে যাবে, তখন সে ভেলু দিবে আবার এক বাড়ালে তার পরে যাবে এবং তখন সে ভেলু দিবে ৭০। এভাবে আমরা শেষ পর্যন্ত লুপ চালিয়ে কাজটা করতে পারি। নিজে নিজে চেষ্টা করে দেখো। এই ব্যাপারে বিস্তারিত জানতে পারবে এখানে ! আজ এই পর্যন্তই।
টা টা!
মনে করো আলমকে আমি ১০ টাকা দিলাম এবং সেফাতকে আলমের পেছনে লাগায়া দিলাম। সেফাত যেহেতু আলমকে ফলো করে আলমকে দিয়ে আমি সে টাকাটা ফিরিয়ে আনতে পারবো তাইনা? একইভাবে সেফাতকে দিয়ে আমি আলমের কাছে টাকাটা পাঠিয়েও দিতে পারবো।
এখানে আলম একটা ভেরিয়েবল হিসেবে কাজ করছে আর ছ্যাঁচড়া সেফাত পয়েন্টার হিসেবে কাজ করছে। পয়েন্টারের কাজই হলো কোন একটা ভেরিয়েবলকে পয়েন্ট করা/অ্যাড্রেস রাখা/ফলো করা একই কথা। কোন একটা পয়েন্টার যখন কোন একটা ভেরিয়েবলের অ্যাড্রেস রাখে তখন ওই পয়েন্টার সেই ভেরিয়েবলের সমস্ত ইনফরমেশন জানতে পারে।
পয়েন্টার সি প্রোগ্রামিং এর গুরুত্বপূর্ণ এবং শক্তিশালী একটা জিনিস যা সরাসরি মেমরির সাথে জড়িত। এটা দিয়ে অনেক কাজ খুব দ্রুত সময়ে কমপ্লিট করা যায়।
আমরা জানি ভেরিয়েবলের কাজ হলো ডাটা রাখা, যেমন আলম ১০ টাকা রাখছে। পয়েন্টারের কাজ হলো সেই ভেরিয়েবলের অ্যাড্রেস রাখা। কাউকে ফলো করা আর তার অ্যাড্রেস জেনে রাখা একই জিনিস। অনেকে প্রশ্ন করতে পারো ভেরিয়েবলের অ্যাড্রেসটা আবার কি, তাদের জন্য-
আমরা সবাই জানি, ভেরিয়েবল ডিক্লেয়ার করলে সে মেমরিতে একটা যায়গা তৈরী করে নেয় এবং ডাটাটা সেখানে রেখে দেয়। প্রতিটা যায়গারই একটা অ্যাড্রেস থাকে। পয়েন্টার সেই অ্যাড্রেসটাই জমা রাখে। একটা ভেরিয়েবলের সামনে & বসালেই তার অ্যাড্রেস পাওয়া যায়। নীচের প্রোগ্রামে দেখো আলমের কাছ থেকে কিভাবে তার অ্যাড্রেস জানতেছি
#include <stdio.h>
int main()
{
int alom = 10; //alom k 10 taka diye dilam B-)
printf("Total taka in alom: %d\n", alom); //alom er kache koto taka ache ta jantechi
printf("Address of Alom: %d\n", &alom); //alom ekhon koi ache ta jantechi
return 0;
}
OUTPUT
Total taka in alom: 10
Address of alom: 6356748
এখন যে কাজটা করবো তা হল সেফাতকে আলমের পিছনে লাগায়া দিবো। আই মিন, সেফাতকে বলবো আলমের পিছে পিছে ঘুরতে। সেফাতের কাজই হলো যেহেতু আলমের অ্যাড্রেস জেনে রাখা তাই সেফাতের আগে অবশ্যই * দিতে হবে। ছ্যাঁচড়াদের আইডেন্টিফাই করার জন্য তার আগে স্টেরিক ব্যবহার করতে হয়।
#include <stdio.h>
int main()
{
int alom; //alom aslo
alom= 10; //alom re 10 taka dilam
int *sefat; //chesra sefat re hajir korlam
sefat = &alom; //sefat re alom er address chinaya disi. lou thela
printf("alom er kache taka ache: %d\n", alom); //printing the value of alom
printf("sefat er kache alom er address: %d\n", sefat); //seeing the address of alom from sefat
return 0;
}
OUTPUT
alom er kache taka ache: 10
sefat er kache alom er address: 6356748
এখন আমরা চাইলে সেফাতের কাছ থেকে জানতে পারবো আলমের কাছে কত টাকা আছে-
#include <stdio.h>
int main()
{
int alom = 10;
int *sefat;
sefat = &alom;
printf("%d", *sefat); //Sefat is showing the value in alom
return 0;
}
OUTPUT
10
আবার যদি চাই আলমের কাছের যে টাকা আছে তা পরিবর্তন করতে সেটা কিন্তু আমরা সেফাতকে দিয়েই করতে পারবো। মনে করো আমি সেফাতকে বললাম আলমের কাছে এখন ২০ রাখো। সেফাত দ্রুত আলমের কাছে গিয়ে ২০ টাকা রেখে দিবো।
#include <stdio.h>
int main()
{
int alom = 10;
int *sefat;
sefat = &alom;
*sefat = 20; //Changing the value of alom by sefat
printf("Current value of alom: %d", alom); //Printing the value of Alom
return 0;
}
OUTPUT
10
দেখতে পাচ্ছো আমরা কিন্তু আলমকে কিছুই বলিনাই। সেফাতরে দিয়ে ঘটনা ঘটিয়ে ফেললাম। অথ্যাৎ, সেফাতকে দিয়ে আলমের ভেলু পরিবর্তন করে ফেললাম। চাইলে কিন্তু আলমের ব্যালান্স শুন্যও করে দিতে পারি। সো, বি কেয়ারফুল।
সেফাত এবং আলমের মধ্যে কিন্তু একটা জিনিসের মিল আছে। তারা কেউ ই একসাথে একাধিক ভেলু রাখতে পারেনা। আলম যেমন একসাথে একাধিক ভেলু রাখতে পারেনা আবার সেফাত একসাথে একাধিক লোককে ফলো করতে পারেনা। সেফাত ডিজিটাল ছ্যাঁচড়া। একসাথে একাধিক মানুষের সাথে চামচামি সে একদমই পছন্দ করেনা। তো, কোনভাবে সেফাতকে যদি কেকা নামের একজন ব্যাক্তির অ্যাড্রেস ধরায়া দিতে পারি তাহলে কিন্তু সে আর আলমকে ফলো না করে কেকাকে ফলো করবে।
#include <stdio.h>
int main()
{
int alom = 10;
int keka = 999;
int *sefat;
sefat = &alom; // sefat ekhon alom k follow kortese
printf("Sefat er point kora address a j value pawa gelo: %d\n", *sefat); //alomer value
sefat = &keka; // Sefat ekhon kekappike follow kortese
printf("Sefat er point kora jaygay bortoman value: %d\n", *sefat); //kepapir value
return 0;
}
OUTPUT
Sefat er point kora address a j value pawa gelo: 10
Sefat er point kora jaygay bortoman value: 999
সেফাত বড্ড বেড়ে গেছে। যাকে তাকে ফলো করে বসতেছে। তুমি চাইলে কিন্তু সেফাতকে পুরা ডাম্ব করে দিতে পারো। মানে সে কাউকেই ফলো করবেনা। এটা করতে হলে সেফাতকে একটা NULL দিয়ে দাও। ভেজাল শেষ। বিশ্বাস না হলে করে দেখো, সে তোমাকে কোন ভালু বা অ্যাড্রেস কিছুই দিতে পারবেনা।
তুমি কি জানো একটা অ্যারের নাম নিজেই একটা পয়েন্টার? অথ্যাৎ, আমাদের যদি একটা অ্যারে হয় int myArr[] = {50, 60, 70, 80, 90} এখানে myArr হলো একটা পয়েন্টার যার কাছে থাকবে প্রথমজনের অ্যাড্রস। মানে হলো myArr এর কাছে থাকে myArr[0] এর অ্যাড্রেস। বিশ্বাস না হলে *myArr প্রিন্ট করে দেখো তোমার আউটপুট আসবে 50.
#include <stdio.h>
int main()
{
int myArr[] = {50, 60, 70, 80, 90};
printf("%d", *myArr);
return 0;
}
OUTPUT
50
এখন সেই অ্যাড্রেসটা যদি সেফাতকে দেখিয়ে দিতে পারি তাহলে কিন্তু সে এবার কেকাকে ভূলে গিয়ে এখানে এসে myArr[0] কে পয়েন্ট করবে। বুঝতেই পারছো সেফাত এখন কোন ভালুটা আউটপুট দিবে।
#include <stdio.h>
int main()
{
int myArr[] = {50, 60, 70, 80, 90};
int *sefat = myArr;
printf("%d", *sefat);
return 0;
}
OUTPUT
50
অ্যারেতে মেমরি ব্লক হিসেবে কাজ করে অথ্যাৎ, সবগুলো ভেরিয়েবল পাশাপাশি যায়গা করে নেয় সেহেতু পয়েন্টারকে এক এক করে বাড়িয়ে আমরা সবগুলো ভেলু এক্সেস করতে পারি। যেমন, সেফাতকে এক বাড়ালে সে পরের অ্যাড্রেসে যাবে, তখন সে ভেলু দিবে আবার এক বাড়ালে তার পরে যাবে এবং তখন সে ভেলু দিবে ৭০। এভাবে আমরা শেষ পর্যন্ত লুপ চালিয়ে কাজটা করতে পারি। নিজে নিজে চেষ্টা করে দেখো। এই ব্যাপারে বিস্তারিত জানতে পারবে এখানে ! আজ এই পর্যন্তই।
টা টা!