4,二维数组中指针的问题

一、问题来源:


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]

原文地址:https://www.cnblogs.com/letgo/p/5760851.html