2017-04-02 9 views
9
typedef float vec3[3]; 

void test(vec3 const vptr) { 
    *vptr = 1.f; // error: assignment of read-only location 
    vptr[0] = 1.f; // error: assignment of read-only location 
    vptr++; // no error 
} 

सी typedef स्थिरांक तर्क

vec3 const vptr 

रूप

const vec3 vptr 
सभी typedefs के लिए

ही है? क्या पिछले दो के बीच कोई अंतर है? मैंने सोचा था कि

vec3 const vptr <==> float* const vptr // a constant pointer to an object 
const vec3 vptr <==> const float* vptr // a pointer to a constant object 
??? <==> const float* const vptr // a constant pointer to a constant object 

उत्तर

4

यह typedef

typedef float vec3[3]; 

सरणी प्रकार float[3]

सरणी प्रकार const float[3] होने के रूप में पैरामीटर के इस घोषणा

vec3 const vptr 

वाणी vptr के लिए उपनाम परिभाषित करता है।

सरणी तत्व प्रकार के रूप में निर्दिष्ट फ़ंक्शन पैरामीटर को सरणी तत्व प्रकारों की ऑब्जेक्ट्स पर पॉइंटर्स में समायोजित किया जाता है।

तो यह घोषणा

vec3 const vptr 

प्रकार const float *vptr लिए निकाला जाता है। यह एक निरंतर वस्तु के लिए एक निरंतर सूचक है।

इस संबंध

vec3 स्थिरांक < ==> नाव * स्थिरांक vptr // एक निरंतर सूचक vptr एक वस्तु

करना गलत है। और यह कथन

vptr++; // no error 

पुष्टि करता है कि।

आप इस typedef

typedef float vec3[3]; 
+0

ऐसा नहीं है कि 'vec3 स्थिरांक vptr'' को स्थिरांक नाव * vptr' निकाला जाता है इतना नहीं है का उपयोग करते हुए इस घोषणा

const float* const vptr 

नहीं मिल सकता है। यह सिर्फ एक फ़ंक्शन पैरामीटर के लिए है, दोनों बराबर हैं। – Peter

+0

@ पीटर वे नहीं हैं। ऐरे पैरामीटर वास्तव में निश्चित (मूल रूप से सभी) परिस्थितियों में पॉइंटर्स को समायोजित किए जाते हैं। इस विस्तार को अनदेखा करने से, समायोजित कहने में व्लाड अधिक सही है। – 2501

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