ড্যанглিং পয়েন্টার
ড্যанглিং পয়েন্টার হলো এমন পয়েন্টার যা ইতিমধ্যে ফ্রি বা ডিলিট করা মেমরি লোকেশনকে পয়েন্ট করে। পয়েন্টার ড্যанглিং হতে পারে নিম্নলিখিত উপায়ে:
ফাংশন কল
লোকাল ভেরিয়েবলে পয়েন্ট করার পয়েন্টার ড্যাংলিং হয়ে যায় যদি লোকাল ভেরিয়েবল static না হয়।
int* show(void) {
int n = 76;
return &n;
}আউটপুট
গারবেজ ঠিকানা আউটপুট হবে।
মেমরি ডি-অ্যালোকেশন
int main() {
float* p = (float*)malloc(sizeof(float));
free(p); // free() কল করার পর p ড্যাংলিং পয়েন্টার
p = NULL; // এখন p ড্যাংলিং নয়
}ভেরিয়েবল স্কোপ থেকে বাইরে যাওয়া
int main() {
int* p;
{
int c;
p = &c;
}
// এখানে p ড্যাংলিং পয়েন্টার
}ভয়েড পয়েন্টার
ভয়েড পয়েন্টার যেকোনো ডেটা টাইপের সাথে জড়িত নয়। এটি স্টোরেজে ডেটা লোকেশনের ঠিকানা নির্দেশ করে। এটাকে জেনারেল পারপাস পয়েন্টারও বলা হয়।
সীমাবদ্ধতা:
- কনক্রিট সাইজ না থাকায় পয়েন্টার আритমেটিক সম্ভব নয়।
- এটি ডিরেফারেন্স করা যায় না।
উদাহরণ
#include <stdlib.h>
#include <iostream>
using namespace std;
int main() {
int a = 7;
float b = 7.6;
void* p;
p = &a;
cout << *((int*)p) << endl;
p = &b;
cout << *((float*)p);
return 0;
}আউটপুট
7 7.600000
অ্যালগরিদম
Begin
ইন্টিজার a এবং ফ্লোট b ইনিশিয়ালাইজ করুন।
ভয়েড পয়েন্টার p ঘোষণা করুন।
(int*)p = ভয়েডের টাইপ কাস্টিং।
p = &b মানে p এখন ফ্লোট।
(float*)p = ভয়েডের টাইপ কাস্টিং।
মান প্রিন্ট করুন।
End.নাল পয়েন্টার
নাল পয়েন্টার কোনো কিছুই পয়েন্ট করে না। এর ব্যবহার:
পয়েন্টার ভেরিয়েবল ইনিশিয়ালাইজ করার সময়যখন এখনো কোনো বৈধ ঠিকানা নেই।
ফাংশন আর্গুমেন্টে নাল পয়েন্টার পাস করুন যখন কোনো বৈধ ঠিকানা পাস করতে চান না।
পয়েন্টার অ্যাক্সেস করার আগে নাল চেক করুন তাতে ডিরেফারেন্স করার সময় এরর হ্যান্ডলিং করা যায়।
উদাহরণ
#include <iostream>
using namespace std;
int main() {
int* p = NULL;
cout << "The value of pointer is ";
cout << p;
return 0;
}আউটপুট
The value of pointer is 0.
ওয়াইল্ড পয়েন্টার
ওয়াইল্ড পয়েন্টার যেকোনো আর্বিট্রারি মেমরি লোকেশনে পয়েন্ট করে (নালও নয়)।
int main() {
int* ptr; // ওয়াইল্ড পয়েন্টার
*ptr = 5; // অনির্দিষ্ট আচরণ
}