一、问题来源:
1 int a[3][4],下面哪个不能表示 a[1][1]?
2 *(&a[0][0]+5)
3 *(*(a+1)+1)
4 *(&a[1]+1)
5 *(a[1]+1)
这显然考察了二维数组中指针的问题,为了更全面的理解这个问题,我们打印出各个变量的类型和值,来判断哪个选项正确。
二、测试代码如下:
1 #include <iostream>
2 #include <typeinfo>
3 using namespace std;
4
5 int main(int argc, char** argv) {
6 /*vector<int> v = {3, 2, 2, 4, 7, 9, 10, 1, 1};
7 Soultion s;
8 s.reOrderArray3(v);
9 for (auto element : v) {
10 cout << element << " " ;
11 }*/
12
13 double a[3][4] = {{0, 1, 2, 3},
14 {4, 5, 6, 7},
15 {8, 9, 10, 11}};
16
17
18 cout << typeid(a).name() <<" "
19 << typeid(*a).name() <<" "
20 << typeid(a[0]).name() <<" "
21 << typeid(&a[0]).name() <<" "
22 << typeid(&a[0][0]).name() <<" "
23 << typeid(**a).name() << endl ;
24 cout << a <<" "
25 << *a <<" "
26 << a[0] <<" "
27 << &a[0] <<" "
28 << &a[0][0] << endl;
29 cout << a[1] <<" "
30 << &a[1] << endl;
31 /*
32 cout << *(&a[0][0] + 5) << endl;
33 cout << *(*(a + 1) + 1) << a+1 << ' '<<*(a+1) <<endl;
34 cout << *(&a[1] + 1) <<' ' << a[2] << endl;
35 cout << *(a[1] + 1) <<endl;*/
36
37
38 return 0;
39 }
结果输出,
从结果中我们可以看到,
1, a: 二维数组类型,A3_A4_d。大小3*4,元素类型为double。a的值 == 二维数组的地址== a[0][0]的地址
2,*a:一维数组类型,A4_d。大小1*4,元素类型为double。*a的值 == 第0行的地址(二维数组第0个一位数组的地址)== a[0][0]的地址
3,a[0]: 一维数组类型,A4_d。大小1*4,元素类型为double。a[0]的值 == *a的值 == 第0行的地址(二维数组第0个一位数组的地址)==a[0][0]的地址
4,&a[0]: 指针类型,指向一维数组,PA4_d,即 double (*)[4]。&a[0]的值 == a[0]的值 == *a的值 == 第0行的地址(二维数组第0个一位数组的地址)==a[0][0]的地址
然后,我们回到本文最开始的题目。
选项A,很容易判断
选项B,*(a+1) == a[1] == a[1][0]的地址, *(*(a+1)+1) == a[1][0]
选项C,&a[1]+1,因为&a[1]指向第1行这个1*4的一维数组,&a[1]+1则指向第2行这个二维数组,所以*(&a[1]+1) == a[2],为第2行的地址
选项D,a[1] == &a[1][0], *(a[1]+1) == a[1][0]