Fork me on GitHub

指针与多维数组

多维数组

多维数组实际上是数组的数组的数组的………….

例如:a[3][4],a指向一个维度为4的一维数组,a指向这个一维数组的第一个元素,*a表示这个一维数组的第一个元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
int a[3][4] , sum = 1;
for(int i = 0 ; i<3 ; ++i){
for(int j = 0 ; j<4 ; ++j){
a[i][j] = sum++;
}
}

for(int i = 0 ; i<3 ; ++i){ //遍历
for(int j = 0 ; j<4 ; ++j){
cout << *(*(a+i) + j) << ' ';
}
cout<<endl;
}

函数的多维数组参数

两种方式:

1
2
void print(int (*a)[10])
void print(int a[][10]) //实际形参是指向含有10个元素的数组的指针


注意:在函数里的参数不能直接用begin和end
1
2
3
4
void print(int (*a)[10]){
cout<<end(a) - begin(a); //无法通过编译
cout<<end(*a) - begin(*a); // 10
}

使用范围for循环处理多维数组

1
2
3
4
5
6
int arr[2][4] = {1 , 2 , 3 , 4 , 5 , 6};
for(auto &i : arr){
for(auto j : i){
cout<<j;
}
}

注意上面代码i使用了引用类型,如果不加&,那么编译器会把 i 变为指针类型int *,这样内层循环就不合法了。

1
2
3
4
5
6
7
int arr[2][4] = {1 , 2 , 3 , 4 , 5 , 6};
for(auto p = begin(arr) ; p != end(arr) ; ++p){
for(auto q = begin(*p) ; q != end(*p) ; ++q){
cout<<*q;
}
}
//相当于声明了 int (*p)[4] = arr;