%p और %x दोनों हेक्साडेसिमल आउटपुट देते हैं, लेकिन उनके उपयोग और व्यवहार में अंतर है।
तुलना
| विशेषता | %p (पॉइंटर) | %x (हेक्स इंटीजर) |
|---|---|---|
| उद्देश्य | पॉइंटर एड्रेस प्रिंट करना | अनसाइन्ड इंटीजर को हेक्स में प्रिंट करना |
| आर्गुमेंट टाइप | void* | unsigned int |
| लीडिंग जीरोज | आमतौर पर पूरे एड्रेस चौड़ाई तक (जैसे 0x00007fff...) | नहीं (न्यूनतम चौड़ाई) |
| प्रीफिक्स | इम्प्लीमेंटेशन-डिफाइंड (आमतौर पर 0x) | नहीं (जब तक # फ्लैग न हो: %#x) |
| पोर्टेबिलिटी | पॉइंटर्स के लिए सही | पॉइंटर्स के लिए अनडिफाइंड बिहेवियर |
उदाहरण
#include <stdio.h>
int main() {
int x = 59;
int *ptr = &x;
printf("Value using %%p (int): %p\n", x); // गलत उपयोग लेकिन काम कर सकता है
printf("Value using %%x (int): %x\n", x); // सही: 3b
printf("Pointer using %%p: %p\n", (void*)ptr); // सही: 0x7ffc...
printf("Pointer using %%x: %x\n", (unsigned int)ptr); // 32-बिट पर काम कर सकता है
return 0;
}
आउटपुट (64-बिट सिस्टम)
Value using %p (int): 000000000000003B Value using %x (int): 3b Pointer using %p: 0x7ffc12345678 Pointer using %x: 7ffc12345678
सर्वोत्तम अभ्यास
- पॉइंटर्स के लिए **हमेशा
%pऔर(void*)कास्ट** उपयोग करें। - इंटीजर्स के लिए
%x(लोअरकेस) या%X(अपरकेस) उपयोग करें। %pका सटीक फॉर्मेट इम्प्लीमेंटेशन-डिफाइंड है (C मानक)।