1 //数组名是常量指针,
2 //a指向数组首元素,指针步长为数组元素大小,&a同样也指向数组首地址,指针步长为数组大小,如下: 4 //a+1 是相对数组起始地址偏移了sizeof(int)字节
5 //&a+1 是相对于数组起始地址偏移了sizeof(a)字节
6 int a[] = { 1, 3, 2, 4 };
7 cout << *a << *(a + 1) << *(a + 2) << *(a + 3) << endl; //1324
8
9
10 cout << a << " " << &a << endl; //两地址相同
11 cout << &a + 1 << "," << &a + 2 << endl; //0048FBB8,0048FBC8,刚好差了16字节
12
13 auto ta = a; //这个方式有趣,只能用这种方式原样使用数组
14 cout << ta[0] << ta[1] << ta[2] << ta[3] << endl; //1324
15
16 //向上取址,正确方式
17 int b = 10;
18 int* p = &b;
19 int** pp = &p; //
20 int*** ppp = &pp;
21 int**** pppp = &ppp;
22
23 //向上取址,错误方式
24 int** ppt = &(&b); //&b是常量地址,&(&b)是对常量取址,错误行为,只有变量能取址
25
26
27 //定义一个指向 int[4]类型的指针pa,注意,数组元素个数必须相等,不能是 int(*pa)[2] = &a;
28 int(*pa)[4] = &a;
29
30 //同理,可以先定义一个int (*)[4]类型,再用它定义变量
31 typedef int(*Arr4Ptr)[4]; //声明类型
32 Arr4Ptr px = &a; //定义变量
33
34 //数组内存是连续的吗?
35 //答案:数组的一级元素在内存中都是连续存放的,示例如下:
36
37 int iarr1[6]; //内存连续
38 int iarr2[6]; //内存连续
39 int iarr3[6]; //内存连续
40 float farr[3]; //内存连续
41
42 int* arrptrs[3];
43
44 arrptrs[0] = iarr1;;
45 arrptrs[1] = iarr2;
46 arrptrs[2] = iarr3;
47
48 //一级元素共3个,每个都是类型为 int*的指针,它们在内存中是连续存放的:
49 //002CF994,002CF998,002CF99C
50 cout << &(arrptrs[0]) << "," << &(arrptrs[1]) << "," << &(arrptrs[2]) << endl;
51
52 //二级元素iarr1,iarr2, iarr3明显是不连续存放的,因为它们是三个不相关的普通变量
53 cout << iarr1 << "," << iarr2 << "," << iarr3 << endl;
参考:https://www.cnblogs.com/nosadness/p/4369937.html