2016-04-21 12 views
7

तो मैं एक struct:एक कॉन्स int const * variable को ठीक से कैसे प्रारंभ करें?

typedef struct myStruct 
{ 
    const int *const array_ptr; 
} myStruct_s; 

मैं int के const सरणी है:

const myStruct_s structArray[SIZE2] = 
{ 
     [0] = 
      { 
        .array_ptr = &constArray 
      }, 
     //... 
} 

:

const int constArray[SIZE1] = 
{ 
     [0] = 0, 
     [1] = 1, 
     [2] = 2, 
     //... 
}; 

अब मैं myStruct_s के const सरणी नामित intializers साथ प्रारंभ है मुझे चेतावनी मिलती है:

प्रकार का एक मूल्य "स्थिरांक पूर्णांक (*) [SIZE1]" प्रकार का एक इकाई "स्थिरांक पूर्णांक * स्थिरांक"

मैं कैसे ठीक से इस सूचक को प्रारंभ कर सकते हैं प्रारंभ करने में इस्तेमाल नहीं किया जा सकता है?

मैं से बचने के लिए करना चाहते हैं:

const myStruct_s structArray[SIZE2] = 
{ 
     [0] = 
      { 
        .array_ptr = (const int *const) &constArray 
      }, 
     //... 
} 

यदि संभव हो, के बाद से मुझे लगता है कि मैं संकलक बता "मुझे लगता है मैं क्या कर रहा हूँ पता नहीं है, बस प्रकार की जांच नहीं करते कृपया" ...

आपकी मदद के लिए धन्यवाद :)।

+1

'array_ptr = & constArray [0];' – Nadir

+3

ऐरे इंडेक्स 0 से शुरू होते हैं। आपके असाइनमेंट ('[1] = 1') 1 से शुरू होते हैं। समस्या से संबंधित नहीं, लेकिन संदिग्ध लग रहा है। – davmac

+0

@ डेवमैक: आप सही हैं! दरअसल मैं सरणी भरने के लिए इंडेक्स के रूप में 'enum' का उपयोग करता हूं। मैं जादू संख्याओं का कभी भी उपयोग नहीं करता :)। मैंने अपने कोड को थोड़ा सा सरल बना दिया! – Plouff

उत्तर

11

constArray (में decays) एक सूचक है, तो आप

.array_ptr = constArray 

या

.array_ptr = &constArray[0] /* pointer to the first element */ 
बजाय

.array_ptr = &constArray /* you don't want the address of */ 

चाहते पर विचार पहले से ही है

int a[] = {1,2}; 
int *p = &a; 

यह सही है क्योंकि p तो, 2 int (&a) की एक सरणी

+1

सही है, लेकिन वास्तव में क्यों एक 'स्पष्टीकरण का उपयोग कर सकता है' और constArray' काम नहीं करता है। – davmac

+0

आह, ठीक है, मैं कोशिश करूंगा लेकिन मेरी अंग्रेजी बहुत खराब है :) –

+0

@davmac, किया गया, –

-1

आप constArray पहले से एम्परसेंड निकाल देना चाहिए के लिए एक int (&a[0] या बस a), एक नहीं सूचक के लिए सूचक चाहता है जो कि नहीं है एक संगत सूचक प्रकार उत्पन्न करें।

कारण: सरणी को सी में पॉइंटर्स के समान माना जाता है। इसलिए constArray पहले से प्रभावी रूप से const int *const है। लेकिन जब आप पता लेते हैं, यानी &constArray आपको वास्तव में एक प्रकार मिल रहा है जो const int *const *const के साथ संगत होगा।

+4

नहीं। आपको एक प्रकार मिल रहा है जो 'const int (*) [] 'के साथ संगत होगा। जब वे '&' के संचालन होते हैं तो Arrays पॉइंटर्स को क्षय नहीं करते हैं। – davmac

+3

दूसरा पैराग्राफ कचरा है –

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