পয়েন্টার এরিথমেটিক (Pointer Arithmetic)
পয়েন্টার ভেরিয়েবল এক্সপ্রেশনে ব্যবহার করা যায়। যেকোনো পয়েন্টার যখন ইনক্রিমেন্ট/ডিক্রিমেন্ট করা হয়, তখন সেটি তার পয়েন্ট করা ডেটা টাইপের সাইজ অনুযায়ী এগিয়ে/পিছিয়ে যায়।
বৈধ অপারেশনগুলো
| অপারেশন | বিবরণ |
|---|---|
*p1 + *p2 | দুই ভ্যালুর যোগ |
*p1 - *p2 | দুই ভ্যালুর বিয়োগ |
*p1 * *p2 | গুণ |
*p1 / *p2 | ভাগ (নোট: / * এর মাঝে স্পেস দিন, নাহলে কমেন্ট মনে হবে) |
p1 + n | পয়েন্টার n এলিমেন্ট ফরওয়ার্ড |
p2 - n | পয়েন্টার n এলিমেন্ট ব্যাকওয়ার্ড |
p1 - p2 | দুই পয়েন্টারের মধ্যে এলিমেন্ট সংখ্যা (সেইম অ্যারেতে থাকতে হয়) |
p1++, --p2 | ইনক্রিমেন্ট/ডিক্রিমেন্ট |
p1 > p2, p1 == p2 | তুলনা (সেইম অ্যারেতে অর্থবহ) |
অবৈধ অপারেশনগুলো
p1 + p2(দুই এড্রেস যোগ করা অর্থহীন)p1 * p2,p1 / p2p1 / 3(পয়েন্টার কনস্ট্যান্ট দিয়ে ভাগ করা যায়না)
উদাহরণ প্রোগ্রাম
#include <stdio.h>
int main() {
int a = 12, b = 4;
int *p1 = &a, *p2 = &b;
int x, y;
x = *p1 * *p2 - 6; // 12*4 - 6 = 42
y = 4 - *p2 / *p1 + 10; // 4 - 4/12 + 10 = 4 - 0 + 10 = 14 (ইন্টিজার ডিভিশন)
printf("Address of a = %p\n", (void*)p1);
printf("Address of b = %p\n", (void*)p2);
printf("a = %d, b = %d\n", a, b);
printf("x = %d, y = %d\n", x, y);
return 0;
}
আউটপুট
Address of a = 0x7ffc1234 Address of b = 0x7ffc1238 a = 12, b = 4 x = 42, y = 14
ব্যাখ্যা
*p1= 12,*p2= 4x = 12 * 4 - 6 = 48 - 6 = 42y = 4 - 4/12 + 10 = 4 - 0 + 10 = 14(ইন্টিজার ডিভিশনে ৪/১২ = ০)
সারসংক্ষেপ
- পয়েন্টার এরিথমেটিক শুধু একই অ্যারে/অবজেক্টের মধ্যে অর্থবহ।
p1 - p2দিয়ে এলিমেন্ট দূরত্ব পাওয়া যায়।- ভ্যালু এক্সেসের জন্য ডিরেফারেন্স (
*) ব্যবহার করুন।