2013-01-11 13 views
9

मैं कोड का एक टुकड़ा है, जो में है वहाँस्थिर चार स्थिरांक को प्रारंभ * somevar

#include ... 

static char const *program_name; 

... 
int main(int argc, char** argv){ 
program_name = argv[0]; 

... 
} 

मैं सोच रहा हूँ पढ़ रहा हूँ कैसे कर सकते हैं एक const चर करने के लिए मुख्य कार्य असाइन मूल्य। किसी भी सहायता की सराहना की जाएगी!

उत्तर

12

घोषणा:

static char const *program_name; 

कहते program_name निरंतर वर्णों के लिए एक (चर) सूचक है। सूचक बदल सकता है (इसलिए इसे main() में असाइन किया जा सकता है), लेकिन इस पॉइंटर के माध्यम से इंगित स्ट्रिंग को बदला नहीं जा सकता है।

तुलना करें और के साथ इसके विपरीत:

static char * const unalterable_pointer = "Hedwig"; 

यह चर डेटा के लिए एक निरंतर सूचक है, सूचक, बदला नहीं जा सकता है, हालांकि स्ट्रिंग अगर यह एक शाब्दिक पर नहीं था बात करने के लिए प्रारंभ किया गया था, स्ट्रिंग संशोधित किया जा सकता है:

static char owls[] = "Pigwidgeon"; 
static char * const owl_name = owls; 

strcpy(owl_name, "Hedwig"); 

/* owl_name = "Hermes"; */ /* Not allowed */ 

भी तुलना और के साथ इसके विपरीत:

static char const * const fixed_pointer_to_fixed_data = "Hermes"; 

यह एक है निरंतर डेटा के लिए निरंतर सूचक।

+0

दो अन्य उदाहरणों के लिए धन्यवाद! तब मुझे लगता है कि मूल रूप से घोषित होने पर '* program_name'' const' है, यानी 'स्थिर char const * program_name;'। क्या आपका आशय यही था? – AoZ

+0

सही। आप '* program_name = 'a' लिख नहीं सकते; 'क्योंकि' program_name' निरंतर डेटा को इंगित करता है; आप इस सूचक के माध्यम से डेटा को संशोधित नहीं कर सकते हैं (हालांकि एक ही डेटा के अन्य पॉइंटर्स इसे संशोधित करने में सक्षम हो सकते हैं - इस मामले में, आप '* argv [0] = 'a' लिख सकते हैं; 'यदि आप चाहते हैं, हालांकि मैं कर सकता हूं ऐसा करने के लिए एक अच्छा कारण नहीं सोचते हैं)। –

7

program_name कॉन्स चार के लिए एक सूचक है, न कि एक कॉन्स पॉइंटर। असाइनमेंट स्टेटमेंट पॉइंटर को सूचक के लिए मान निर्दिष्ट करता है।

+0

आपका उत्तर भी समझ में आता है, लेकिन मैं जोनाथन के विस्तृत स्पष्टीकरण को पसंद करता हूं। फिर भी, धन्यवाद! – AoZ

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