C में मान के लिए पता या पॉइंटर प्रिंट करें


80

मैं कुछ ऐसा करना चाहता हूं जो काफी सरल लगता है। मुझे परिणाम मिलते हैं लेकिन समस्या यह है कि मेरे पास यह जानने का कोई तरीका नहीं है कि परिणाम सही हैं या नहीं।

मैं सी में काम कर रहा हूं और मेरे दो पॉइंट हैं; मैं पॉइंटर की सामग्री को प्रिंट करना चाहता हूं। मैं पॉइंटर को डीरेंशन नहीं करना चाहता, क्योंकि जिस वैल्यू को मैंने स्टोर किया है, उसे पाने के लिए मुझे पॉइंटर चाहिए।

मैंने निम्नलिखित कोड लिखा है और जो मुझे जानना आवश्यक है कि क्या यह सही है और यदि नहीं, तो मैं इसे कैसे सही कर सकता हूं।

जब मैं इसे पोस्ट कर रहा हूं (और इसका कारण यह महत्वपूर्ण है कि यह सही है) यह है कि मुझे अंततः एक पॉइंटर-टू-ए-पॉइंटर के लिए ऐसा करने की आवश्यकता है। अर्थात्:


आपने जो लिखा है वह सही है, आप वास्तव में किस समस्या का सामना कर रहे हैं?
लुका मैटीस

जैसा कि मैंने वर्णन किया है, मुझे परिणाम मिल रहे थे लेकिन यह जानने का कोई तरीका नहीं था कि क्या परिणाम सही थे या यदि यह मुझे रद्दी दे रहा था। नीचे डॉन और अन्य (साथ ही साथ स्वयं) ने पुष्टि की कि ये परिणाम मान्य हैं।
फ्रैंक वी

जवाबों:


29

आपके पास जो है वह सही है। बेशक, आप देखेंगे कि एम्प 1 और आइटम 1 में एक ही पॉइंटर मूल्य है।


1
यदि आइटम 1 का प्रकार एक से अधिक वंशानुक्रम का हिस्सा है और / या एम्प का पूर्वज है, तो यह इस बात पर निर्भर करता है कि कंपाइलर प्रत्येक आइटम के प्रकार की रचना कैसे करता है।
जिम बक

2
@ जिम: "सी" टैग अन्यथा सुझाव देता है
हस्त्कर्ण

1
@ जय: हस्त्कुर्क सही है। मैं सी। में काम कर रहा हूं। मुझे वह पोस्ट करना चाहिए था।
फ्रैंक वी

39

सूचक को सूचक में पता प्रिंट करने के लिए:

एक बार डीफरेंस करने के लिए और दूसरा पता प्रिंट करने के लिए:

आप डिबगर के साथ हमेशा सत्यापित कर सकते हैं, यदि आप लिनक्स के उपयोग पर हैं dddऔर मेमोरी को प्रदर्शित करते हैं, या सिर्फ सादे हैं gdb, तो आपको मेमोरी एड्रेस दिखाई देगा ताकि आप अपने पॉइंटर्स में मूल्यों के साथ तुलना कर सकें।


16

मेरा मानना ​​है कि यह सबसे सही होगा।

printf()एक परिवर्तनशील कार्य है और सही प्रकार के तर्क दिए जाने चाहिए। मानक कहता %pहै void *


मुझे लगता है कि उन्हें पदोन्नत किया जाएगा? निश्चित नहीं, कोई स्पष्ट कर सकता है?
रस्ताजेडी

4
कुछ शोध के बाद, नहीं, वे स्वचालित रूप से पदोन्नत नहीं होते हैं। void *वास्तव में एक कास्ट की आवश्यकता है।
रस्ताजेडी ६

10

चूंकि आप पहले से ही मूल पॉइंटर एड्रेस डिस्प्ले को हल कर चुके हैं, इसलिए यहां बताया गया है कि आप डबल पॉइंटर के पते की जांच कैसे करेंगे:

आप ऐसा करके डबल पॉइंटर के पते पर पहुँच सकेंगे a:


printf("which contains this value: %c\n" **a);बस उस ^ ^ को जोड़ना चाहते थे।
रस्तजेडी

4

परिणाम:

ptr: 0xbfb4027f, मान: A, और यह भी पता: 3216245375


0

मैं इस स्थिति में रहा हूँ, विशेष रूप से नए हार्डवेयर के साथ। मेरा सुझाव है कि आप अपनी खुद की एक छोटी हेक्स डंप दिनचर्या लिखें। आप डेटा को देख पाएंगे, और वे पते जिस पर वे हैं, सभी को एक साथ दिखाया गया है। यह अच्छा अभ्यास और एक विश्वास बिल्डर है।


3
अज्ञानी लगने की कीमत पर - क्या आप इस बारे में विस्तार से बता सकते हैं कि कोई इस तरह की दिनचर्या कैसे लिखता है?
फैसल वली

1
साथ ही यह उत्तर एक टिप्पणी के रूप में बेहतर हो सकता है?
रस्ताजेडी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.