二维数组在内存中是如何存放的
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是那样? 展开
#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是那样? 展开
1个回答
展开全部
因为你的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。你是怎么算的把代码贴上来吧!
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询