2010-04-14 13 views
5

मान लीजिए मैं कुछ सूचक है, जो मैं के रूप में स्थिर आयाम सरणी संदर्भ पुनर्व्याख्या करना चाहते हैं:क्या पॉइंटर को आयामी सरणी संदर्भ के रूप में पुन: परिभाषित करना संभव है?

double *p; 
double (&r)[4] = ?(p); // some construct? 

// clarify 
template< size_t N> void function(double (&a)[N]); 
... 
double *p; 
function(p); // this will not work. 
// I would like to cast p as to make it appear as double[N] 

ऐसा करना संभव है? मैं इसे कैसे कर सकता हूं?

उत्तर

10

यह बदसूरत है:

double arr[4]; 
double* d = arr; 

double (&a)[4] = *static_cast<double(*)[4]>(static_cast<void*>(d)); 

यकीन है कि सरणी प्रकार से मेल खाता क्या सूचक मूल रूप से आया हो।

+0

'डबल (*) [4] ', यह निर्माण क्या है? यह पहली बार है जब मैं इसे देखता हूं – Anycorn

+0

@aaa: यह 4 युगल की सरणी के लिए एक सूचक है। – GManNickG

+0

एक आखिरी सवाल, क्यों पहले * शून्य करने के लिए कास्ट? – Anycorn

-2

हाँ, यह एक vector :)

std::vector<double> myVariableArray(4) 

संपादित कहा जाता है: फिर से पढाना, ऐसा लगता है कि आप आकार एक सरणी के साथ घोषित किया गया था प्राप्त करना चाहते हैं। आप ऐसा नहीं कर सकते - यह एक टेम्पलेट विधि सुविधा है जिसे आप अवसर पर उपयोग कर सकते हैं। चूंकि double * को double पर इंगित करने की आवश्यकता नहीं है, इसलिए किसी भी मामले में एक कंपाइलर आपको एक समझदार उत्तर दे सकता है।

+1

एह, वही नहीं। – GManNickG

+0

@GMan: हाँ - बस उसे एहसास हुआ। संपादित। प्रारंभ में इसका अर्थ यह है कि "क्या मैं रनटाइम पर ज्ञात आयाम के साथ एक सरणी बना सकता हूं" –

-2
double *array; 
... 
... 
int sizearray = sizeof(array)/sizeof(double); 
+0

यहां तर्क गलत है। 'Array' यह क्या के लिए अंक के बारे में कोई जानकारी नहीं किया जाता है। यह हमेशा एक ही जवाब वापस करेगा, कोई फर्क नहीं पड़ता कि क्या। – GManNickG

+2

आकार (सरणी) जब सरणी एक सूचक है तो पॉइंटर आकार वापस देगी, आमतौर पर ओएस के आधार पर 4 या अधिक। –

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

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