数组指针一些理解

安稳与你 提交于 2020-02-29 19:26:32
		printf("%d",*p++);     //注意此处是先进行后面的运算p++; 
		printf("%d",*++p); 
		printf("%d\n",p[i]);   //此时指针就相当于数组名 
		printf("%-2d",(*p)++);//如果数组是a[6]={1,1,1,1,1} ,
      则应该打印{12345}
        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 所指的对象大小是 4int,而 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)
`

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!