2012-08-07 14 views
5

मैं एक multidumentional सरणी statndard रास्ता बनाने के लिए कैसे पता:सी ++ में पॉइंटर कैसे बनाएं जो int की बहुआयामी सरणी को इंगित करता है?

const int m = 12; 
const int y = 3; 
int sales[y][n]; 

और मुझे पता है एक सूचक है कि एक आयामी सरणी के लिए अंक बनाने का तरीका:

int * ms = new int[m]; 

लेकिन यह एक सूचक बनाने के लिए संभव है जो multidumentional सरणी को इंगित करता है?

int * sales = new int[y][m]; // doesn't work 
int * mSales = new int[m]; // ok 
int * ySales = new int[y]; // ok 
mSales * ySales = new mSales[y]; // doesn't work, mSales is not a type 

ऐसे पॉइंटर कैसे बनाएं?

+1

संभावित डुप्लिकेट [मैं सी ++ में सरणी का उपयोग कैसे करूं?] (Http://stackoverflow.com/questions/4810664/how-do-i-use-arrays-in-c) – fredoverflow

उत्तर

8

अभिव्यक्ति new int[m][n] एक array[m] of array[n] of int बनाता है:

बेशक

हम जब संभव :)

+0

+1 प्रश्न का उत्तर देने और समझाने के लिए कि समस्या का सही समाधान क्यों नहीं है। –

+1

एक उदाहरण 'मैट्रिक्स' वर्ग के लिए http://stackoverflow.com/a/9760489/245265 देखें जो 'std :: vector' को लपेटता है। –

+0

+1, मेरे उत्तर से काफी बेहतर विचार था। –

5

निश्चित रूप से, यह संभव है।

आप किसी पूर्णांक पर एक सूचक के लिए सूचक बना रहे होते हैं, और वाक्य रचना की तरह यह लग रहा है:

int** ptr = sales; 

आप शायद इस के अधिक उदाहरण से आप के रूप में जब लोगों को पारित लगता है देखा है तारों के सरणी (जैसा कि आप मुख्य() में argv में करते हैं), आप हमेशा वर्णों की एक सरणी को पार कर रहे हैं।

int** array = new int*[m]; 
for(int i=0; i<m; i++) { 
    array[i] = new int[n]; 
} 
+4

पॉइंटर्स की एक सरणी नहीं है एक बहु-आयामी सरणी के समान। –

3

मुझे याद है यह कुछ इस तरह था सब std :: स्ट्रिंग उपयोग करके अपनी पसंद। चूंकि यह एक सरणी नया है, इसलिए रिटर्न प्रकार को पॉइंटर में में पहला तत्व परिवर्तित किया गया है: pointer to array[n] of int। कौन क्या आप उपयोग करने के लिए है:

int (*sales)[n] = new int[m][n]; 

बेशक, अगर तुम सच में सरणी नए सब पर उपयोग नहीं करना चाहिए। _best_solution स्मृति के लिए std::vector का उपयोग करके, सरल Matrix कक्षा लिखना है। इस मामले पर अपनी भावनाओं के आधार पर, आप कर सकते हैं या तो अधिभार operator()(int i, int j) और अनुक्रमण के लिए (i, j) उपयोग करें, या आप operator[](int i) ओवरलोड कर सकते हैं एक सहायक जो operator[] को परिभाषित करता है दूसरा सूचीकरण करने के लिए वापस जाने के लिए। (संकेत: operator[]int* पर परिभाषित किया गया है, यदि आप जाँच सीमा, आदि, int* प्रॉक्सी के रूप में काम करेगा साथ परेशान करने के लिए नहीं करना चाहती।)

वैकल्पिक रूप से, की तरह कुछ:

std::vector<std::vector<int> > sales(m, n); 

नौकरी करेगा, लेकिन लंबी अवधि में, Matrix कक्षा के लायक होगी।