2009-12-19 6 views
7

मैं अब सी में तारों के बारे में सीख रहा हूं।स्कैनफ़ को तारों के लिए एम्पर्सेंड की आवश्यकता क्यों नहीं है और printf (सी में) में भी ठीक काम करता है?

कैसे scanf का उपयोग करने के लिए एक स्ट्रिंग प्राप्त करने के लिए आप

scanf("%s",str1); 

और printf के लिए आप कर सकते हैं कर सकते हैं आ

printf("The string is %s\n", str1); 

मैं समझता हूँ कि scanf के लिए है क्योंकि स्ट्रिंग सिर्फ एक चरित्र है सरणी जो एक सूचक है, लेकिन printf के लिए, यह कैसे है कि आप केवल वैरिएबल नाम डाल सकते हैं जैसे आप एक int या float के लिए चाहते हैं?

उत्तर

10

scanf को पढ़ने के लिए चर के पते की आवश्यकता है, और स्ट्रिंग बफर को पहले से ही पते के रूप में दर्शाया गया है (स्मृति में किसी स्थान पर सूचक, या एक संकेतक जो एक सूचक में विघटित होता है)।

printf एक ही पॉइंटर-टू-स्ट्रिंग के रूप में %s का इलाज करता है।

5

सी में, वेरिएबल्स जो सरणी हैं, वे सरणी के पहले तत्व को पॉइंटर बनते हैं जब फ़ंक्शन तर्क के रूप में उपयोग किया जाता है - इसलिए आपका स्कैनफ़() स्मृति में पॉइंटर को देखता है (माना जाता है कि "str1" एक सरणी है)।

आपके printf() में, "str1" या तो एक स्ट्रिंग या एक वर्ण सरणी के लिए एक सूचक हो सकता है (जिस स्थिति में printf() द्वारा देखा गया तर्क सरणी के पहले तत्व के लिए एक सूचक होगा)।

+0

अधिक सटीक रूप से, सरणी प्रकार की अभिव्यक्ति पूरी तरह से सरणी के पहले तत्व में सूचक के लिए ("क्षय") परिवर्तित होती है लेकिन सभी संदर्भ नहीं। एक फ़ंक्शन तर्क उन संदर्भों में से एक होता है जहां रूपांतरण होता है। –

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