2009-07-05 10 views

उत्तर

14

आप इसे आरंभ करना चाहते हैं, तो आप कह सकते हैं:

int jagged[][3] = { {0,1}, {1,2,3} }; 

लेकिन सरणी अभी भी आकार [2] [3] होगा। यदि आप एक असली जंजीर सरणी चाहते हैं, तो आपको इसे गतिशील रूप से बनाना होगा। और यदि आप ऐसा करते हैं, और सी ++ का उपयोग कर रहे हैं, तो आपको std::vector का उपयोग करना चाहिए, जैसा कि फ्रोल सुझाव देता है।

12

सी ++ में (संकलित नहीं है, और शायद वहाँ एक और अधिक कॉम्पैक्ट वाक्य रचना है):, myArray [0] [0], आदि उदाहरण के लिए

std::vector<std::vector<int> > myArray; 

myArray.push_back(std::vector<int>()); 
myArray.push_back(std::vector<int>()); 

myArray[0].push_back(0); 
myArray[0].push_back(1); 

myArray[1].push_back(1); 
myArray[1].push_back(2); 
myArray[1].push_back(3); 

तो अब आप के साथ तत्वों का उपयोग कर सकते,

+1

एआरएम आप एक वेक्टर में एक पॉइंटर को दबा रहे हैं जो पॉइंटर्स नहीं रखता है ... – Goz

21

सीआई में पॉइंटर्स की एक सरणी का उपयोग करेगा।

उदाहरण के लिए:

int *jagged[5]; 

jagged[0] = malloc(sizeof(int) * 10); 
jagged[1] = malloc(sizeof(int) * 3); 

आदि आदि

+0

इस उदाहरण में, स्मृति को मुक्त करने का सही तरीका क्या है? – papgeo

15

तरीके यह करने के लिए के एक समूह है। यहाँ एक और तरीका है:

int jagged_row0[] = {0,1}; 
int jagged_row1[] = {1,2,3}; 
int *jagged[] = { jagged_row0, jagged_row1 }; 
+3

+1। यह वह जगह है जहां सी 99 के यौगिक अक्षर दिखाते हैं: 'int * jagged [] = {(int []) {0,1}, (int []) {1, 2, 3}}; 'क्या यह भी अच्छा नहीं है? –

+2

इस समाधान के साथ समस्या यह है कि उप-सरणी तुरंत पॉइंटर्स को क्षय हो जाती हैं, इसलिए आपके पास यह बताने का कोई मतलब नहीं है कि सीमाएं क्या हैं। –

+0

@Neil, मैंने इस बारे में बिल्कुल नहीं सोचा था। बेशक आप ठीक हैं। अच्छा बिंदु :) –

2

C99 में आप क्या कर सकते हैं निम्नलिखित:

int jagged_row0[] = {0,1}; 
int jagged_row1[] = {1,2,3}; 

int (*jagged[])[] = { &jagged_row0, &jagged_row1 }; // note the ampersand 

// also since compound literals are lvalues ... 
int (*jagged2[])[] = { &(int[]){0,1}, &(int[]){1,2,3} }; 

यहां फर्क सिर्फ इतना है (जैसा कि rampion के जवाब की तुलना में) कि सरणियों संकेत दिए गए और एक है करने के लिए क्षय नहीं है अविवेक के एक अन्य स्तर के माध्यम से अलग-अलग सरणियों का उपयोग करने की - (जैसे *jagged[0] - यानी sizeof(*jagged[0]) संकलन नहीं होगा - और प्रत्येक पंक्ति के आकार दर्ज किया गया है) - लेकिन वे दांतेदार-प्रदर्शित हो रहे हैं हड्डी के लिए;)

+0

मैंने सोचा था कि आप अधूरे प्रकार के सरणी नहीं बना सकते हैं ... ओह, आप पॉइंटर्स की एक सरणी को अपूर्ण प्रकार के लिए बना रहे हैं, यह संभव है लेकिन आपको रैंपियन के उत्तर पर कुछ भी नहीं खरीदता है। –

3

कारण आपको त्रुटि मिली है कि आप एम ust कम से कम बाहरी आयाम के लिए सीमा निर्दिष्ट करें; अर्थात

int jagged[][3] = {{0,1},{1,2,3}}; 

आप नहीं हो सकता दांतेदार [0] पूर्णांक और दांतेदार [1] int की एक 3-तत्व वाली सरणी होना का एक 2-तत्व वाली सरणी होना; एक एन-एलिमेंट सरणी एक एम-एलिमेंट सरणी (जहां एन! = एम) से एक अलग प्रकार है, और सरणी के सभी तत्व एक ही प्रकार के होना चाहिए।

क्या आप कर सकते हैं जो दूसरों ने ऊपर सुझाव दिया है और int के लिए पॉइंटर्स की सरणी के रूप में जंजीर बनाते हैं; इस तरह प्रत्येक तत्व इंगित कर सकते हैं विभिन्न आकारों की सरणियों पूर्णांक:

int row0[] = {0,1}; 
int row1[] = {1,2,3}; 
int *jagged[] = {row0, row1}; 

हालांकि row0 और ROW1 विभिन्न प्रकार (int की 2-तत्व बनाम 3-तत्व सरणियों) प्रारंभकर्ता वे कर रहे हैं के संदर्भ में, कर रहे हैं दोनों अंतर्निहित रूप से एक ही प्रकार (int *) में परिवर्तित हो गए।

1

सी ++ 11 प्रारंभकर्ता सूचियों के साथ this अधिक दृढ़तापूर्वक लिखा जा सकता है:

#include <vector> 
#include <iostream> 

int main() { 
    // declare and initialize array 
    std::vector<std::vector<int>> arr = {{1,2,3}, {4,5}}; 
    // print content of array 
    for (auto row : arr) { 
     for (auto col : row) 
      std::cout << col << " "; 
     std::cout << "\n"; 
    } 
} 

उत्पादन होता है:

$ g++ test.cc -std=c++11 && ./a.out 
1 2 3 
4 5 

संदर्भ के लिए:

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