二維、三維陣列初始化及遍歷
阿新 • • 發佈:2021-02-11
二維陣列初始化及遍歷:
int arr2[3][4] = { {43,35,61,72}, {65,33,55,22}, {23,56,33,77} }; //方法1 cout << "Method 1:\n"; for(int i = 0; i < 3; i++) { for(int j = 0; j < 4; j++) { cout << arr2[i][j] << " "; } cout << "\n"; } //指標和多維陣列 //方法2 cout << "Method 2:\n"; //i指向含有4個整數的陣列,類似i = &arr2[];那麼*i則表示一個一維陣列 for(int (*i)[4] = arr2; i<arr2+3; i++) { //此時*i表示一個一維陣列,我們知道一維陣列的陣列名就是該陣列的首地址,那麼(*i)就指向該一維陣列首地址 for(int *j = *i; j<*i+4; j++) { cout << *j << " "; } cout << "\n"; } //方法3 //在方法2基礎上使用c++11的auto關鍵字 cout << "Method 3:\n"; for(auto i = arr2; i < arr2 + 3; i++) { for(auto j = *i; j < *i+4; j++) { cout << *j << " "; } cout << "\n"; } //方法4 //使用標準庫的begin()、end()函式 cout << "Method 4:\n"; for(int (*i)[4] = begin(arr2); i != end(arr2); i++) { for(int *j = begin(*i); j != end(*i); j++) { cout << *j << " "; } cout << "\n"; } //方法5 //在方法4的基礎上使用auto關鍵字 cout << "Method 5:\n"; for(auto i = begin(arr2); i != end(arr2); i++) { for(auto j = begin(*i); j != end(*i); j++) { cout << *j << " "; } cout << "\n"; } //多維陣列下標引用 //方法6 //除了最內層可以不用引用外,其它都需要用引用。如果需要修改資料,則最內層也需要用引用 cout << "Method 6:\n"; for(auto &x:arr2) //若寫成for(auto x : arr2),則x表示int*,這樣內層迴圈遍歷一個指標顯然不合法 { for(auto &y:x) { printf("%d ", y); } printf("\n"); }
執行結果:
三維陣列:
3維陣列可以理解為是由多個2維陣列構成:
//可以理解arr[2][3][4]為由2個tmp[3][4]二維陣列構成 int arr[2][3][4] = { { {43,35,64,75},{65,33,55,22},{23,56,33,77} }, { {22,44,56,24},{24,87,46,34},{34,36,73,58} } }; //遍歷3維陣列的方法和上面遍歷二維陣列的方法一樣,下面舉例2種具有代表性的方法,其它方法的大家可自行練習 //舉兩種初始化方法 //方法1 cout << "Method 1:\n"; for(int (*x)[3][4] = arr; x!=arr+2; x++) { for(int (*y)[4] = *x; y!=*x+3; y++) { for(int *z = *y; z!=*y+4;z++) { printf("%d ", *z); } printf("| "); } printf("\n"); } //方法2 cout << "Method 2:\n"; for(auto &x:arr) { for(auto &y:x) { for(auto &z: y) { printf("%d ", z); } printf("| "); } printf("\n"); }
執行結果:
參考:c++ primer5