二维数组在内存中是如何存放的

c语言。#include<stdio.h>#defineM3#defineN4intmain(){inta[M][N],i,j,*p;for(p=a[0],i=0;i<M... c语言。
#include<stdio.h>
#define M 3
#define N 4
int main()
{
int a[M][N],i,j,*p;
for(p=a[0],i=0;i<M;i++)
for(j=0;j<N;j++)scanf("%d",p++);
printf("begin=%o\nend=%o\n",a[0],p--);
printf("d=%d\n",p-a[0]);
return 0;
}
输出结果发现
end-begin=80或者280

distance始终为11。
哪位跟我解释以下为什么end-begin是那样?
展开
 我来答
White_MouseYBZ
2015-04-16 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6712万
展开全部
因为你的a[M][N]有12个元素,所以end-begin(即p-a[0])肯定恒为11。因为指针相减的结果是元素差而不是地址差。比如若有int a[3]={1,2,3};则&a[1]-&a[0]=1,而它们的地址值却相差4。在内存中无论几维数组,都是按一维数组存放的。比如二维数组,第一行最后一个元素后就紧接着第二行的第一个元素,依此类推。这也是多维数组都可以降维为一维数组来处理的原因。
更多追问追答
追问
那么为什么末元素地址和首元素地址的差值是80或者280呢?
追答
在你的代码中,一共有12个元素,每个元素4字节,如果用末元素地址减去首元素地址只可能是11*4=44而不可能是什么80或280。你是怎么算的把代码贴上来吧!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式