目录
对于32位运行平台,指针地址占用4字节。就是说存放一个指针的地址需要用4字节存储。
64位,指针地址占用8字节。
注意:优先级问题,数组下标[]运算法 高于 指针*运算符
以下测试针对32位处理器
基本说明
- 数组指针:变量是指针,一维 char (*p)[3] 、二维 char (*p)[2][3] ,长度固定是4字节
- 指针数组:变量是数组,每个位置存放的是指针地址 一维 char *p[3] 、二维 char *p[2][3]
说白了就是存放指针的数组,还是数组
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,调到了下一个二维数组的开始位置。
总结,
数组指针只是定义了程序的下标索引格式、偏移量等等。就是告诉程序要怎么去读取一个地址段空间里的数据。