यह सरल प्रश्न हो सकता है, लेकिन एक कांस्ट चर * को इंगित करने के लिए मेमोरी पते की आवश्यकता क्यों नहीं है?
उदाहरण:
const char* a = "Anthony";
और नहीं:
const char *a = // Address to const char
किसी भी अन्य प्रकार की तरह?
यह सरल प्रश्न हो सकता है, लेकिन एक कांस्ट चर * को इंगित करने के लिए मेमोरी पते की आवश्यकता क्यों नहीं है?
उदाहरण:
const char* a = "Anthony";
और नहीं:
const char *a = // Address to const char
किसी भी अन्य प्रकार की तरह?
जवाबों:
आप इस घोषणा की कल्पना कर सकते हैं
const char* a = "Anthony";
निम्नलिखित तरीका है
const char string_literal[] = "Anthony";
const char *a = string_literal;
यह संकलक स्थैतिक भंडारण अवधि के साथ वर्णों की एक सरणी बनाता है जो स्ट्रिंग को संग्रहीत करता है "Anthony"
और सरणी के पहले वर्ण का पता (सरणी रचनाकारों के उनके पहले वर्णों को इंगित करने वालों के अंतर्निहित रूपांतरण के कारण) को सूचक को सौंपा गया है a
।
यहां एक प्रदर्शन कार्यक्रम है जो दर्शाता है कि स्ट्रिंग लिटरल कैरेक्टर एरे हैं।
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
कार्यक्रम का आउटपुट है
The size of the referenced array is 8
Anthony
स्ट्रिंग शाब्दिक का आकार (स्ट्रिंग शाब्दिक रूप से संग्रहीत करने वाले सरणी) के बराबर है 8
क्योंकि स्ट्रिंग में समाप्ति शून्य वर्ण भी शामिल है \0'
।
प्रदर्शनकारी कार्यक्रम में अभिव्यक्ति
std::extent<std::remove_reference<decltype( r )>::type>::value
सिर्फ अभिव्यक्ति के लिए प्रतिस्थापित किया जा सकता है
sizeof( r )
एक कांस्ट चार्म को इंगित करने के लिए मेमोरी एड्रेस की आवश्यकता क्यों नहीं है? *
ऐसा होता है।
एक सी-स्ट्रिंग शाब्दिक की तरह
"Anthony"
इसका 1 सेंट चरित्र के पते पर क्षय है । जैसे, बीटीडब्ल्यू; सी में कोई भी सरणी करता है।
const char[8]
(C ++ में, C में हो सकता char [8]
है, निश्चित नहीं है) और सभी अंतर्निहित सरणियों की तरह, जब इसका उपयोग मूल्य के रूप में किया जाता है तो यह एक पॉइंटर से पहले तत्व तक पहुंचता है।
char [8]
C में: c-faq.com/ansi/strlitnotconst.html
इसे मेमोरी एड्रेस की आवश्यकता होती है, और यह मेमोरी एड्रेस है। आपके उदाहरण में यह केवल स्ट्रिंग की शुरुआत का मेमोरी एड्रेस है। यह किसी भी अन्य सरणी चर के साथ समान है जिसे संकलित समय पर आरंभ किया जाता है, उदाहरण के लिए "int array [] = {0, 1, 2, 3};"।
यदि आप निष्पादन योग्य को देखने के लिए एक द्विआधारी संपादक का उपयोग करते हैं, तो आप स्ट्रिंग "एंथोनी" को वहां देखेंगे। यदि आप लाइन "printf (" a is at% p \ n ", (शून्य *) a) डालते हैं;" अपने कार्यक्रम में, फिर उसे संकलित करें और चलाएं, आपको पता दिखाई देगा।
"
const char*
स्मृति पते के लिए सूचक की आवश्यकता क्यों नहीं है?"
वास्तव में, यह करता है करने के लिए बात करने के लिए एक स्मृति पता की जरूरत है।
const char* a
साधन a
एक स्ट्रिंग शाब्दिक या चरित्र स्थिर करने के लिए एक सूचक है।
एक पॉइंटर को हमेशा इंगित करने के लिए एक पते की आवश्यकता होती है क्योंकि यह एक पॉइंटर की प्रकृति को स्मृति में किसी विशिष्ट वस्तु की ओर इंगित करता है। तो, a
और किसी भी अन्य सूचक const char
भी करता है।
एक स्ट्रिंग शाब्दिक जैसे "Hi My Name is Alfred!"
असाइनमेंट द्वारा:
const char* a;
a = "Hi My Name is Alfred!";
स्ट्रिंग पॉरल के पहले तत्व के पते के लिए एक पॉइंटर का फैसला करता है।
बदले में, a
स्ट्रिंग शाब्दिक के पहले तत्व के पते द्वारा असाइन किया जाता है जिसे "Hi My Name is Alfred!"
निष्पादन पर्यावरण पर निर्भर स्मृति में कहीं भी संग्रहीत किया जा सकता है।
यह एक प्रोग्रामर की ताकत में नहीं है जहां एक स्ट्रिंग शाब्दिक संग्रहित है। आपका असाइनमेंट संबंधित पॉइंटर को उचित रूप से असाइन करने और संभालने के लिए है।