2010-03-03 10 views
44

सब के बाद, इन दोनों बयानों एक ही बात करते हैं ...printf के साथ `% p` उपयोगी कहां है?

int a = 10; 
int *b = &a; 
printf("%p\n",b); 
printf("%08X\n",b); 

उदाहरण के लिए (के साथ अलग-अलग पतों):

0012FEE0 
0012FEE0 

यह रूप में %x साथ वांछित सूचक फ़ॉर्मेट करने के लिए मामूली बात है तो, क्या %p विकल्प का कुछ अच्छा उपयोग है?

+1

'% p' ​​का उपयोग करके आप चर में चर के पते को मुद्रित करते हैं, "शून्य * सूचक तर्क हेक्साडेसिमल में मुद्रित होता है (जैसे% # x या% # lx)।" –

+0

सी ++ में, आप (शून्य *) टाइपकास्ट का उपयोग कर सकते हैं: http://stackoverflow.com/questions/5657123/how-to-simulate-printfs-p-format-when-using-stdcout –

उत्तर

111

वे वही काम नहीं करते हैं। उत्तरार्द्ध printf कथन b को unsigned int के रूप में व्याख्या करता है, जो गलत है, b एक सूचक है।

प्वाइंटर और unsigned int रों हमेशा एक ही आकार नहीं हैं, इसलिए इन परस्पर विनिमय नहीं कर रहे हैं। जब वे एक ही आकार नहीं होते हैं (एक सामान्य रूप से आम मामला, 64-बिट CPUs और ऑपरेटिंग सिस्टम अधिक आम हो जाते हैं), %x केवल पते का आधा प्रिंट करेगा। मैक (और शायद कुछ अन्य सिस्टम) पर, पते को बर्बाद कर देगा; आउटपुट गलत होगा।

पॉइंटर्स के लिए हमेशा %p का उपयोग करें।

+12

% पी मंच के लिए सूचक के लिए पर्याप्त पाठ्यचर्या प्रतिनिधित्व का भी उपयोग करेगा। प्लेटफार्मों पर जहां हेक्स में पॉइंटर का प्रतिनिधित्व करना आम बात है, तब तक यह कोई फर्क नहीं पड़ता है जब तक कि आकार सही न हो, लेकिन खंडित आर्किटेक्चर के लिए (क्या आपको डॉस याद है?) यह एक सेगमेंट का उपयोग कर सकता है: ऑफ़सेट प्रतिनिधित्व। – AProgrammer

+8

किसी को भी '%' प्रारूप में 'v'' 'void *' पर डालना होगा - यह सी में कुछ उदाहरणों में से एक है जहां किसी को कलाकारों की आवश्यकता होती है। –

+1

"सारी दुनिया एक वैक्स है!" सिंड्रोम। –

2

x अहस्ताक्षरित हेक्साडेसिमल पूर्णांक (32 बिट)

p सूचक को संबोधित

printf on the C++ Reference देखें है। यहां तक ​​कि यदि वे दोनों ही लिखेंगे, तो मैं एक सूचक मुद्रित करने के लिए %p का उपयोग करूंगा।

+0

हाँ, मैं पहले से ही चला गया वह पृष्ठमैं क्या जानना चाहता था कि आप एक सूचक मुद्रित करने के लिए% p का उपयोग क्यों करेंगे। वैसे भी, पीटर होसे का जवाब मेरे संदेह का जवाब देता है। – Moeb

4

सूचक का आकार कुछ int की तुलना में अलग हो सकता है। जब आप %p का उपयोग करते हैं तो भी एक कार्यान्वयन पते के सरल हेक्स मान प्रतिनिधित्व से बेहतर उत्पादन कर सकता है।

-1

x हेक्साडेसिमल में टी सूचक तर्क मुद्रित करने के लिए प्रयोग किया जाता है।

एक ठेठ पता जब %x का उपयोग कर bfffc6e4 की तरह लग रहे और हैं मुद्रित समझदार %p का उपयोग कर मुद्रित पता होगा 0xbfffc6e4

+0

नहीं, '% x' का उपयोग हेक्साडेसिमल में 'हस्ताक्षरित int' प्रकार के मान को मुद्रित करने के लिए किया जाता है। बिल्कुल कोई गारंटी नहीं है कि 'हस्ताक्षरित int'' शून्य * 'के समान आकार है, और कोड में ऐसा मानना ​​एक बुरा विचार है। – unwind

7

कम से कम एक प्रणाली है कि बहुत असामान्य नहीं है पर, वे एक ही मुद्रित नहीं है:

~/src> uname -m 
i686 
~/src> gcc -v 
Using built-in specs. 
Target: i686-pc-linux-gnu 
[some output snipped] 
gcc version 4.1.2 (Gentoo 4.1.2) 
~/src> gcc -o printfptr printfptr.c 
~/src> ./printfptr 
0xbf8ce99c 
bf8ce99c 

सूचना कैसे सूचक संस्करण उदाहरण के लिए, एक 0x उपसर्ग कहते हैं। हमेशा% p का उपयोग करें क्योंकि यह पॉइंटर्स के आकार के बारे में जानता है, और टेक्स्ट के रूप में उन्हें सर्वश्रेष्ठ तरीके से कैसे प्रस्तुत किया जाए।

5

आप एक 0x उपसर्ग प्रदर्शित %p पर निर्भर नहीं कर सकते हैं। दृश्य सी ++ पर, यह नहीं है। पोर्टेबल होने के लिए %#p का उपयोग करें।

+1

क्या यह कहीं दस्तावेज है? मुझे # पी के साथ संयोजन के रूप में # के बारे में कुछ भी नहीं मिला। मैंने जांच की है: http://msdn.microsoft.com/en-us/library/8aky45ct(v=vs.71).aspx http://www.cplusplus.com/reference/clibrary/cstdio/printf/ – Suma

+0

पीसी -लिंट इसे पसंद नहीं करता है, लेकिन यह विजुअल स्टूडियो में काम करता है। दुर्भाग्य से यह '0 एक्स' नहीं '0x' तैयार करता है, जिससे वास्तविक मूल्य पढ़ने के लिए कठिन होता है। संभवतः यह एक लापता '% पी' संस्करण के कारण है। सभी ने बताया, यह प्रारूप विनिर्देशक सभी 'प्लेटफार्म आश्रित' कार्यान्वयन की समस्या से पीड़ित है, कि आप जो भी प्राप्त करने जा रहे हैं उसे वास्तव में नियंत्रित नहीं कर सकते हैं। मैं शुरुआत में डबल 0x0X प्राप्त करने के जोखिम पर '0x% p' का उपयोग करता हूं। इसके बजाय इसका उपयोग कमजोर पड़ता है, क्योंकि आप जानते हैं कि आप% x के साथ क्या प्राप्त कर रहे हैं। –

0

जब आप डिबग करने के लिए की जरूरत है, %p विकल्प के साथ प्रयोग के printf वास्तव में उपयोगी है। जब आपके पास शून्य मान होता है तो आप 0x0 देखते हैं।

संबंधित मुद्दे