c语言中指针变量取值问题,c语言初学者,求指点

#include<stdio.h>
main()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int *p;
for(p=a[0];p<a[0]+12;p++)
{if((p-a[0])%4==0)printf("\n");//p移动四次后换行
printf("%4d",*p);
}
printf("\n");
return 0;
}
我主要是对注释部分不明白啊,假设二维数组的0行0列的首地址为2000,则第一次循环p=2000,则当p++后则p内的地址就应该变成2000+4 =2004了(这里的加1不是代表4个字节吗),这样的话没有循环4次就应该换行了啊、、、 c语言初学者,求指点

总共12个4字节,每次加一代表移动一个4字节,确实没有错.
你所有的数据总共是12个,移动4次后换行,也就说12个数字会分成3行打印,每行4个数字,
这个4次和一个int的4字节没有关系.追问

我在谭浩强的教材上看到这样一段话,是否可以解释这个问题?如果指针变量p1和p2都指向同一个数组,如执行p2-p1,结果是p2-p1的值(两个地址只差)除以数组元素的长度。则当p++后变成2004.而p-a[0]结果不是4,而是4再除以4等于1.这样的话就是4次一换行了。

追答

是的

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-23
你定义的int型指针p,所以没当p++的时候,p内的地址会加sizeof(int)个字节的长度,也就是4个自己,你可以试一试float的,应该就是sizeof(float)个字节了本回答被网友采纳
第2个回答  2013-09-23
这里的2000,你可以理解为你家的门牌号,然后2000这个对应的门牌号的家有多大,就看系统分多大了,不用纠结这个4字节。想理解更清楚,可以试试把p++改为++p,相比较,你可能会明白些什么。
第3个回答  2013-09-23
地址之间的操作不是简单的加减,而是看相差几个指针指向的数据类型
相似回答