#include <stdio.h>
int main()
{
int array[10] = {0,1,2};
typedef int (*ARRAY)[10]; // 数组指针
int *p1 = array;
ARRAY p2 = &array;
int *p3 = &array;
printf("p1 = %#x\n",p1); // p1 = 0x476c4940
// p1相当于array,array又代表数组array的首地址
printf("p2 = %#x\n",p2); // p2 = 0x476c4940
// p2这里依然是数组首地址
printf("p3 = %#x\n",p3); // p3 = 0x476c4940
// 虽然&array的物理意义是取整个数组元素的地址,但此处表示的依然是数组首地址
printf("int=%dbyte\n",sizeof(int)); // int=4byte
printf("p1+1 = %#x\n",p1+1); // p1+1 = 0x476c4944
// 这里p1移动了本身整型字节大小距离
printf("p2+1 = %#x\n",p2+1); // p2+1 = 0x476c4968
// p2这里移动了整个数组元素内存大小的地址
printf("p3+1 = %#x\n",p3+1); // p3+1 = 0x476c4944
// p3移动整型字节大小距离
//PS:int *p1 = array;和int *p3 = &array;这两个在指针+1的时候主要看前面定义的类型,是char就只移动1个字节大小的地址,是double就移动8个字节大小的地址
printf("*(p1+1) = %#x\n",*(p1+1)); // *(p1+1) = 0x1
// 这里就涉及到解引用了,*p1表示array[0]里面的内容,+1就表示array[1]的内容
printf("*p2+1 = %#x\n",*p2+1); // *p2+1 = 0x476c4944
// *p2暂时还没弄清楚
printf("*(p3+1) = %#x\n",*(p3+1)); // *(p3+1) = 0x1
// *p3表示的依然是array[0]里面的内容,+1就表示array[1]的内容
printf("p1[2]=%d\n",p1[2]); // p1[2]=2
// 这里指针加下标的话,效果跟数组是一样的
printf("p2[2]=%d\n",p2[2]); // p2[2]=1198279056
// 对数组指针的偏移,以整个数组元素内存大小偏移
printf("p3[2]=%d\n",p3[2]); // p3[2]=2
// 跟数组一样
printf("(*p2)[2]=%d\n",(*p2)[2]); // (*p2)[2]=2
// 这是对数组指针的解引用
// printf("(*p1)[2]=%d\n",(*p1)[2]); // error,很明显*p1是0
// printf("(*p3)[2]"=%d,(*p3)[2]); // error,*p3也是0
return 0;
}
数组指针学习
于 2019-03-09 18:42:07 首次发布