C语言中多维数组的理解

/*Ryan-jiangfeng*/

#include <stdio.h>

#define ROW 4
#define COL 2
int main(void)
{ 
	
    int zippo[ROW][COL] = {{2,4},{6,8},{1,3},{5,7}};
	
	int i,j;

	printf(" \n \n");

	for(i=0;i<ROW;i++)
	{		
		printf("  &zippo[%d]=%p\n",i,&zippo[i]);		
	}

	printf(" \n \n");

    for(i=0;i<ROW;i++)
	{
		for(j=0;j<COL;j++)
		{
			printf("  &zippo[%d][%d]=%p\n",i,j,&zippo[i][j]);
		}
	}

	printf(" \n \n");

    printf("  an integer user %d bytes\n",sizeof(int));

	printf(" \n \n");
	
	printf("  zippo= %p,  &zippo=%p, zippo+1= %p\n",zippo,&zippo,zippo+1);
    //zippo是数组首元素的地址,它储存的值即是它本身的地址,zippo=&zippo
	//可以理解为它指向一个包含4元素的一维数组A
	//zippo+1表示指向A第二个元素,即zippo[1]

	printf("  zippo[0]= %p,ziopo[0]+1= %p\n",zippo[0],zippo[0]+1);  
    //zippo[0]是zippo A数组中的第一个元素,可以理解为它指向一个包含2元素的一维数组B
	//zippo[0]+1表示指向zippo[0]的下一个元素,即&zippo[0][1]

	printf("  *zippo= %p , *zippo+1=%p\n",*zippo,*zippo+1);
    //*zippo表示取zippo指向的地址,即&zippo[0]
	//*zippo+1表示取zippo[0]指向的下一个地址,即zippo[0]+1,亦即 &zippo[0][1]
	printf("  zippo[0][0]= %d\n",zippo[0][0]);
    
	printf("  *zippo[0] =%d\n",*zippo[0]);
    //*zippo[0]对zippo[0]指向的地址取值,相当于zippo[0][0],因为zippo[0]指向数组B的第一个元素,
	printf("  **zippo=%d\n",**zippo);

	printf(" \n \n");
	
	printf("  zippo[2][1]= %d\n",zippo[2][1]);

	printf("  *(*(zippo+2)+1)= %d\n",*(*(zippo+2)+1));
	//*zippo=*(zippo+0)=zippo[0]
	//*(zippo+2)=zippo[2]
	//*(*(zippo+2)+1)=zippo[2][1]
    //结论:*(*(zippo+m)+n)=zippo[m][n]
	//对N维的数组取值时要用到N个*
    return 0;
}






运行结果:

jiang@ubuntujeos:~/c/20110825$ gcc testarray.c -o 

testarray.o;./testarray.o
testarray.c:55:2: warning: no newline at end of file


  &zippo[0]=0xbf9f925c
  &zippo[1]=0xbf9f9264
  &zippo[2]=0xbf9f926c
  &zippo[3]=0xbf9f9274


  &zippo[0][0]=0xbf9f925c
  &zippo[0][1]=0xbf9f9260
  &zippo[1][0]=0xbf9f9264
  &zippo[1][1]=0xbf9f9268
  &zippo[2][0]=0xbf9f926c
  &zippo[2][1]=0xbf9f9270
  &zippo[3][0]=0xbf9f9274
  &zippo[3][1]=0xbf9f9278


  an integer user 4 bytes


  zippo= 0xbf9f925c,  &zippo=0xbf9f925c, zippo+1= 0xbf9f9264
  zippo[0]= 0xbf9f925c,ziopo[0]+1= 0xbf9f9260
  *zippo= 0xbf9f925c , *zippo+1=0xbf9f9260
  zippo[0][0]= 2
  *zippo[0] =2
  **zippo=2


  zippo[2][1]= 3
  *(*(zippo+2)+1)= 3

为了方便看地址,我把十六进制的地址转换成十进制


bf9f925c   3214905948
bf9f9260   3214905952
bf9f9264   3214905956
bf9f9268   3214905960
bf9f926c   3214905964
bf9f9270   3214905968
bf9f9274   3214905972
bf9f9278   3214905976


如果想理解多维数组的内存图,可以看看下面这张图片:



最后看得有点头晕,记住这两个结论:

*(*(zippo+m)+n)=zippo[m][n]
对N维的数组取值时要用到N个*。



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值