目录
对于32位运行平台,指针地址占用4字节。就是说存放一个指针的地址需要用4字节存储。
64位,指针地址占用8字节。
注意:优先级问题,数组下标[]运算法 高于 指针*运算符
以下测试针对32位处理器
说白了就是存放指针的数组,还是数组
- char *p;
- printf("char *p => %d\r\n", sizeof(p));
- {
- char *p0[3];
- char *p1[2][3];
- printf("指针数组:\r\n");
- printf("char *p0[3] => %d\r\n", sizeof(p0));
- printf("char *p1[2][3] => %d\r\n", sizeof(p1));
- }
- {
- char(*p0)[3];
- char(*p1)[2][3];
- printf("数组指针:\r\n");
- printf("char (*p0)[3] => %d\r\n", sizeof(p0));
- printf("char (*p1)[2][3] => %d\r\n", sizeof(p1));
- }
输出结果:
- char *p => 4
- 指针数组:
- char *p0[3] => 12
- char *p1[2][3] => 24
- 数组指针:
- char (*p0)[3] => 4
- char (*p1)[2][3] => 4
- int arr[2][3] = { 1, 2, 3, 4, 5, 6 };
- int(*p)[2][3] = arr;//或者 int(*p)[2][3] = &arr;
- printf("%d\r\n", (*p)[0][2]);//指针访问
- printf("%d\r\n", p[0][0][2]);//数组下标访问
此时p是一个指针,它只需要开辟4字节的空间用来存放地址。访问地址的方式有指针操作符号*,也可以通过数组下表访问。
p[0][0][2]貌似是3维度数组,其实可理解为三维数组的索引维0的数组,
- int arr[] = {
- 1, 2, 3,
- 4, 5, 6,
- 7, 8, 9,
- 10, 11, 12 };
-
- int(*p)[2][3] = (int(*)[2][3])arr;
-
- printf("%d\r\n", (*p)[0][2]); // => 3
- printf("%d\r\n", p[0][0][2]); // => 3
- printf("%d\r\n", p[1][0][0]); // => 7
-
- int(*px)[3] = (int(*)[3])arr;
-
- printf("%d %d\r\n", (*px)[0],px[0][0] ); // => 1 1
- printf("%d %d\r\n", (*(px+1))[2],px[1][2]);// => 6 6
p[1][0][0] 结果是7,调到了下一个二维数组的开始位置。
总结,
数组指针只是定义了程序的下标索引格式、偏移量等等。就是告诉程序要怎么去读取一个地址段空间里的数据。