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

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是那样?

因为你的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。你是怎么算的把代码贴上来吧!

正确啊!你用的是%o输出,这是八进制!printf("begin=%o\nend=%o\n",a[0],p--);这一句输出时p还没有减1,所以相差是12个元素,差就应该是48。你用八进制输出48不就是60吗?至于80我这里没有发现。你把printf("begin=%o\nend=%o\n",a[0],p--);改成十进制输出printf("begin=%d\nend=%d\n",a[0],p--);,相信就是48了……

追问

好吧是我进制搞错了- -!!!!多谢指点 那么80那样的值为什么会出来呢...

追答

我试了几次没有出现80!八进制不可能有8这个符号!

温馨提示:答案为网友推荐,仅供参考
相似回答