一维数组:arr[n]
有如下形式:arr+1
arr[n]+1
(&arr)+1
数组名是一个地址,也是一个常量
int arr1[6] = {1,2,3,4,5,6};
(&arr1)+1 对整个数组做了一个地址偏移,+1代表跨过整个数组所占的空间
理解:arr1的地址代表数组的首地址,&arr1虽然是取出首地址,但是其后面的地址都属于这个数组的空间,属于一整个块块。+1只能是以这个数组为单位的后面。
printf("%p\n", arr1+1); //偏移一个数据类型的大小
printf("%p\n", (&arr1)+1); //意味着偏移了整个数组的大小
printf("%p\n", &arr1[1]);
printf("%d\n", (*arr1)+1); //2 只是打印arr1[0] + 1 没有进行赋值操作
*arr1解引用首地址代表的数组为arr1[0]=1;
printf("%d\n", ++ (*arr1)); //2 arr1[0] = arr1[0] +1 做了赋值操作
printf("%d\n", (*arr1)++); //2 由于是后置++ 所以线得到结果然后再赋值
printf("%d\n", *arr1); //3
二维数组:
同理:
//完全初始化
int arr[3][3] = {1,2,3,
4,5,6,
7,8,9};
//arr[0][0+1]; //列偏移 偏移一个元素的大小
//arr[0+1][0]; //行偏移 偏移一个数组的大小
// &arr+1 //偏移整个二维数组的大小 此时以arr整个数组为单位进行偏移。
// &arr[0]+1 //行偏移 此时以arr[0]一行为单位进行偏移。
// &arr[0][0]+1 //列偏移 此时以arr[0][0]一列为单位进行偏移。
printf("%d\n",**(*(&arr+1))); //arr[0][0]
&arr一层解引用为arr[],此时为地址,解引用二层为arr[][],此时还是为地址,解引用第三层的时候才为数据!
printf("%d\n",*(*(&arr[0]+1)));
printf("%d\n",*(&arr[0][0]+1));