现在的位置: 首页 > 综合 > 正文

探究二维数组与指针的关系

2013年06月20日 ⁄ 综合 ⁄ 共 1594字 ⁄ 字号 评论关闭
#include <stdio.h>
    void main()
	{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
     int *p;

	 //a是数组行的首地址而a[0]是数组的0行0列的地址,注意区别!!!!
     //一开始a(这是个地址值)等于a[0](这也是个地址值),都指向元素a[0][0]的地址
     //a[0]相当于{a[0][0],a[0][1],a[0][2],a[0][3]}的数组名

	 printf("a========%d\n",a);
	 printf("a[0]========%d\n",a[0]);
	 printf("\n");

     //计算机按字节编址,int在内存中占有4个字节,每两个元素之间相差4个字节

	  printf("&a[0][0]===&&&&&&&&&&&&&====%d\n",&a[0][0]);
      printf("&a[0][1]===&&&&&&&&&&&&&====%d\n",&a[0][1]);
	  printf("&a[0][2]===&&&&&&&&&&&&&====%d\n",&a[0][2]);
	  printf("\n");

      //第一行和第二行相差16个字节

      printf("&a[0][0]===&&&&&&&&&&&&&====%d\n",&a[0][0]);
      printf("&a[1][0]===&&&&&&&&&&&&&====%d\n",&a[1][0]);
	  printf("\n");

	  //a[0]+1相当于以a[0]为数组名的地址加1,一开始a[0]指向a[0][0]即现在指向了a[0][1]这个元素的地址
      //a[0]+1与&a[0][0]+1值是相等的

	  printf("a[0]+1======%d\n",a[0]+1);
	  printf("&a[0][0]+1======%d\n",&a[0][0]+1);
	  printf("\n");

	  //下一行的行地址(也a+1比a大了16个字节),简称“行地址”

      printf("a+1======%d\n",a+1);
	  printf("\n");

	  //*(a+1)取下一行的行地址里面的值,取行首元素的地址,即下一行的的第一个元素的地址,简称“元素地址”
      //*(a+i)是第i行的第一个元素的地址即a[i][0]的地址    *(a+1)指向的是第i行的首元素的地址,注意是“首元素”!!!

	  printf("*(a+1)===*************===%d\n",*(a+1));
	  printf("\n");

	  //取下一行的的第一个元素的地址里面的值也是首元素的值,即a[1][0]的值

	  printf("**(a+1)===*************===%d\n",**(a+1));
	  printf("\n");

      //姑且认为a[0]为数组名,a[0]+1指向下一个元素即a[0][1],所以*(a[0]+1)==3

	  printf("*(a[0]+1)===*************===%d\n",*(a[0]+1));
	  printf("*(a[0]+2)===*************===%d\n",*(a[0]+2));
	  printf("\n");

	  printf("*(a[0]+4)===*************===%d\n",*(a[0]+4));
	  printf("\n");


	  printf("*(&a[0][0]+1)====*************==%d\n",*(&a[0][0]+1));
	  printf("\n");


     //总之,a是只指向二维数组行“首”地址,简称“行首址”
	 //a[0]是指向二维数组元素的第一个元素的地址


      for(p=a[0];p<a[0]+12;p++)
      {
		 if((p-a[0])%4==0)printf("\n");
         printf("%4d",*p);
	  }
	  printf("\n");
	} 

   

抱歉!评论已关闭.