在坐标纸中怎样画坐标:一个关于C语言中指针的小白问题

来源:百度文库 编辑:神马品牌网 时间:2024/04/30 14:49:21
初学者的小白问题~~

定义一个指针p,一个二维数组a[3][4].
程序中有一段是这样的:
for(p=a[0];p<a[0]+12;p++)
if((p-a[0])%4==0)
printf("\n");

p作为一个指针,它是一个整数么?比如它已经被定义为指向a[0][0],那它的值是什么?上面的程序的应该是指在每行结尾换行,可是为什么要先减a[0]再除以4取余呢?

小白问题~~
迷惑中.
感谢各位的回复~~
可是还有一个地方不是很明白.
比如,a[0][0]的地址是1001, 也就是P一开始是1001, 然后p++, 加到a[0][3]也就是1004的时候,应该换行了,可是这时候p-a[0]不能被4整除,应该是p指向a[1][0]的时候才能被4整除~~
这段程序(后面的部分我记不起来了)是不是想用这样的方法: 当p是下一行的第一个元素的时候,先打印回车,再打印该元素?

p,指针变量占用16位,存放地址。地址是整数,给指针赋值后,所以指针内容是整数。
p=a[0],则p的内容是a[0][0]的地址,即相当于p=&a[0][0];
因为p是从a[0]开始增加的,每增加一,则指向数组中的下一个元素的地址,
所以p-a[0]算出p指向a[0][0]后的第几个元素,若是4的倍数,则换行。
因为a[0][0]的地址并不一定是从0开始分配的,所以不能用绝对地址,要用相对地址判断换行

p是指针,存放的是数据在内存中的地址,如果被定义为指向a[0][0],那么它存放的就是a[0][0]这个数的地址。

上面的数组是3行4列,但在内存里是12个数连续存放的,所以通过(p - a[0]) % 4来换行

指针p不是一个整数,它代表内存地址的一个值。假如有一个地址单元,它的编号位1001,它里面存放一个int型的16,那么*p=16,而p=1001;
数组是程序编译后操作系统分配的一段地址,它的初始值不可预测,所以你的程序中p要先减掉初始值a[0]后才是一个整形的数。

lihai
shangmiande