printf("%d",*p++); //注意此处是先进行后面的运算p++;
printf("%d",*++p);
printf("%d\n",p[i]); //此时指针就相当于数组名
printf("%-2d",(*p)++);//如果数组是a[6]={1,1,1,1,1} ,
则应该打印{1,2,3,4,5}
printf("%-2d",a[0]++);//与上结果`
1 a 是数组首元素的地址,所以 a 的值和&a[0]的值相同,
另一方面,a[0]本身是 包含 4 个整数的数组,因此,
a[0]的值同其首元素的地址&a[0][0]相同。简单的 讲,
a[0]是一个整数大小对象的地址,而 a 是 4 个整数大小
对象的地址。因为整 数和 4 个整数组成的数组开始于同
一个地址,因此 a 和 a[0]的值是相同的。
2, a 所指的对象大小是 4 个 int,而 a[0]所指的对象大小一个 int,因此,a+1 和 a[0]+1 的结果是不同的。
3,二维数组名解引用,降维为一维数组名。 *(a+1) <> a[1]
4, 一维数组名,对其引用,升级为二维数组名。 &a[1] <> (a+1) 、
5, &引用和*解引用互为逆向关系。 此上的说法,不是很严紧,但是限于我们的知识面,当下是可以这样理解的。
printf("%d",*(*(arr+2)+1)); //*arr->arr[0]相当于降 维 *(*(arr+2)+1)->arr[2][1]
printf("%d",arr[2][1]); //A[n]===*(A+n)`相同
1,指针就相当于地址常量
2,数组名就相当于一维指针,数组名又相当于首数组的地址
#include<stdio.h>
int main(void)
{
int arr[3][4]={0};
printf("arr[0]=%p arr[1]=%p arr[2]=%p\n",arr[0],arr[1],arr[2]);//一次跳动四个int
printf("========\n");
printf("arr=%p arr+1=%p arr+2=%p\n",arr,arr+1,arr+2);
printf("========\n");
printf("*arr=%p *arr+1=%p *arr+2=%p\n",*arr,*arr+1,*arr+2);//解引用,相当于降维,一次跳一个int
printf("========\n");
printf("arr=%p arr+1=%p arr+2=%p\n",&arr[0],&arr[0]+1,&arr[0]+2);
/*
arr[i][j ]
(arr+i)第i行的地址
*(arr+i)第i行第0列的地址
*(arr+i) +j第 i行第j列的地址
*(*(arr+i) +j)第i行第j列的 内容
*/
}
``![在这里插入图片描述](https://img-blog.csdnimg.cn/20200229172530994.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dhcm5pbmcxMg==,size_16,color_FFFFFF,t_70)
`