C++数组与指针回顾总结

 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

原文地址:https://www.cnblogs.com/timeObjserver/p/8444250.html