一、初始化
严格来说,c++语言中并没有多维数组,通常所说的多维数组其实是数组的数组。
允许使用花括号括起来的一组值初始化多维数组。类似一维数组,在初始化多维数组时,也并非所有元素的值都必须包含在初始化列表中,未列出的值执行值初始化。
1 int main() 2 { 3 int arr[3][4] = { 4 {0,1,2}, 5 {4,5,6} 6 }; 7 for (int i = 0; i < 3;++i) 8 { 9 for (int j = 0; j < 4;++j) 10 { 11 std::cout << arr[i][j] << " "; 12 } 13 std::cout << std::endl; 14 } 15 return 0; 16 }
输出:
其中,内层嵌套着的花括号也并非必需的,多维数组按序初始化,剩下的执行值初始化。
1 int main() 2 { 3 int arr[3][4] = { 4 0,1,2,4,5,6 5 }; 6 for (int i = 0; i < 3;++i) 7 { 8 for (int j = 0; j < 4;++j) 9 { 10 std::cout << arr[i][j] << " "; 11 } 12 std::cout << std::endl; 13 } 14 return 0; 15 }
二、使用范围for语句处理多维数组
要使用范围for语句处理多维数组,除了最内层的循环外,其他所有循环的控制变量都是引用类型。因为如果不是引用的话,当使用数组作为一个auto变量的初始值时,推断得到的是指针而非数组。
1 int main() 2 { 3 int arr[3][4] = {0}; 4 for (auto &row:arr) 5 { 6 for (auto col:row) 7 { 8 std::cout << col << " "; 9 } 10 std::cout << std::endl; 11 } 12 return 0; 13 }
三、指针和数组
当程序使用多维数组的名字时,也会自动将其转换成指向数组首元素的指针。定义指向多维数组的指针时,千万别忘了这个多维数组实际上是数组的数组。所以由多维数组名转换得来的指针实际上是指向第一个内层数组的指针。
1 int main() 2 { 3 int arr[3][4] = { 0 }; 4 for (auto p = arr; p != arr + 3;++p) 5 { 6 for (auto q = *p; q != *p + 4; ++q) 7 std::cout << *q << " "; 8 std::cout << std::endl; 9 } 10 return 0; 11 }
使用标准库函数begin和end也能实现同样的功能。
1 int main() 2 { 3 int arr[3][4] = { 0 }; 4 for (auto p = std::begin(arr); p != std::end(arr);++p) 5 { 6 for (auto q = std::begin(*p); q != std::end(*p); ++q) 7 std::cout << *q << " "; 8 std::cout << std::endl; 9 } 10 return 0; 11 }