printf ফাংশনে পয়েন্টার বা হেক্সাডেসিমাল মান প্রিন্ট করার জন্য %p এবং %x ব্যবহার করা হয়। যেসব সতহে আউটপুট একই দেখতে পারে, তবে তাদের উদ্দেশ্য এবং আচরণ ভিন্ন।
মূল পার্থক্য
| বিষয় | %p | %x |
|---|---|---|
| উদ্দেশ্য | পয়েন্টার অ্যাড্রেস প্রিন্ট | আনসাইনড হেক্সাডেসিমাল ইন্টিজার |
| আর্গুমেন্ট টাইপ | void* (পয়েন্টার) | unsigned int |
| লিডিং জিরো | প্রিন্ট করে (প্যাডিং করে) | প্রিন্ট করে না |
| প্রিফিক্স (0x) | কম্পাইলার-নির্ভর (সাধারণত হ্যাঁ) | না (ম্যানুয়ালি দিতে হয়) |
| পোর্টেবিলিটি | পয়েন্টার প্রিন্টের জন্য সঠিক | পয়েন্টারের জন্য সঠিক নয় (সাইজ মিসম্যাচ হতে পারে) |
উদাহরণ
#include <stdio.h>
int main() {
int x = 59;
printf("Value using %%p: %p\n", (void*)x); // কাস্ট ভালো অনুশীলন
printf("Value using %%x: %x\n", x);
return 0;
}
আউটপুট (৬৪-বিট সিস্টেমে)
Value using %p: 000000000000003B
Value using %x: 3b
ব্যাখ্যা
%p: পয়েন্টার সাইজ অনুযায়ী (৬৪-বিটে ১৬ হেক্স ডিজিট) লিডিং জিরো দিয়ে প্রিন্ট করে%x: শুধু মানটি হেক্সে প্রিন্ট করে, লিডিং জিরো বা 0x প্রিফিক্স ছাড়া59ডেসিমাল =3Bহেক্স
সঠিক ব্যবহার
- পয়েন্টার প্রিন্ট করলে:
printf("%p", (void*)ptr);— সবসময়void*কাস্ট করুন - হেক্স মান প্রিন্ট করলে:
printf("%x", val);বাprintf("0x%x", val); %p-র আউটপুট ফরম্যাট ইমপ্লিমেন্টেশন-ডিফাইনড (স্ট্যান্ডার্ড নিশ্চিত করে না) — ডিবাগিংয়ের জন্য ঠিক, পার্সিংয়ের জন্য নয়