Const char * को मेमोरी एड्रेस के लिए पॉइंटर की आवश्यकता क्यों नहीं होती है?


18

यह सरल प्रश्न हो सकता है, लेकिन एक कांस्ट चर * को इंगित करने के लिए मेमोरी पते की आवश्यकता क्यों नहीं है?

उदाहरण:

const char* a = "Anthony";

और नहीं:

const char *a = // Address to const char

किसी भी अन्य प्रकार की तरह?


8
क्या आपको लगता है कि स्ट्रिंग शाब्दिक स्मृति पते नहीं है?
user207421

2
माना। मुझे यह उम्मीद नहीं है कि कोई भी यह सवाल पूछेगा कि क्या मूल्य श्रेणियां मौजूद हैं, अकेले जाने दें कि उनके नाम हैं।
user4581301

13
कृपया C और C ++ से टैग किए गए प्रश्न न पूछें। जैसा कि हम देख सकते हैं, उत्तर अब सी ++ विशिष्ट हैं और दोनों भाषाओं के बीच के अंतर के बारे में टिप्पणी फिर से प्राप्त होती है। अब तक बहुत सारे अंतर हैं, यह सवाल पूछना मुश्किल है कि वास्तव में दोनों भाषाओं के लिए एक ही मान्य उत्तर है। निर्णय लें कि आप पूछने से पहले किस भाषा का उपयोग करना चाहते हैं।
लर्की

जवाबों:


26

आप इस घोषणा की कल्पना कर सकते हैं

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 )

5

एक कांस्ट चार्म को इंगित करने के लिए मेमोरी एड्रेस की आवश्यकता क्यों नहीं है? *

ऐसा होता है।

एक सी-स्ट्रिंग शाब्दिक की तरह

"Anthony"

इसका 1 सेंट चरित्र के पते पर क्षय है । जैसे, बीटीडब्ल्यू; सी में कोई भी सरणी करता है।


अधिक विशेष रूप से, यह प्रकार का है const char[8](C ++ में, C में हो सकता char [8]है, निश्चित नहीं है) और सभी अंतर्निहित सरणियों की तरह, जब इसका उपयोग मूल्य के रूप में किया जाता है तो यह एक पॉइंटर से पहले तत्व तक पहुंचता है।
निकोस सी।

@NikosC।: इस संदर्भ में सबसे महत्वपूर्ण जादू क्रिया की याद दिलाने के लिए धन्यवाद! ;)
एल्क

जवाब के लिए धन्यवाद! मैं सोच रहा था कि इसे स्मृति कहाँ से मिलती है।
वेइलेडिक्स

1
C के लिए नहीं बोल सकते, लेकिन मुझे पूरा यकीन है कि C ++ निर्दिष्ट नहीं करता है कि स्टिंग शाब्दिक कहाँ संग्रहीत किया जाना चाहिए। बस खोदते चले गए। यदि कोई नियम है, तो यह "स्ट्रिंग शाब्दिक" के किसी भी उल्लेख से कहीं दूर अजीब और दफन है।
user4581301

2
@NikosC। char [8]C में: c-faq.com/ansi/strlitnotconst.html
डेविड

1

इसे मेमोरी एड्रेस की आवश्यकता होती है, और यह मेमोरी एड्रेस है। आपके उदाहरण में यह केवल स्ट्रिंग की शुरुआत का मेमोरी एड्रेस है। यह किसी भी अन्य सरणी चर के साथ समान है जिसे संकलित समय पर आरंभ किया जाता है, उदाहरण के लिए "int array [] = {0, 1, 2, 3};"।

यदि आप निष्पादन योग्य को देखने के लिए एक द्विआधारी संपादक का उपयोग करते हैं, तो आप स्ट्रिंग "एंथोनी" को वहां देखेंगे। यदि आप लाइन "printf (" a is at% p \ n ", (शून्य *) a) डालते हैं;" अपने कार्यक्रम में, फिर उसे संकलित करें और चलाएं, आपको पता दिखाई देगा।


0

" 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!"निष्पादन पर्यावरण पर निर्भर स्मृति में कहीं भी संग्रहीत किया जा सकता है।

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

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