这不是与p+3-p=12矛盾,而是,这个等式本来就不成立好不。学指针的时候会有点糊涂,这个很正常。
你把两个东西混淆了:数组的下标和实际的地址。
float类型的指针,在地址上来说的确是按4字节为单位移动的,但是在数组里面还是一格一格一栋栋饿啊,这个一格的单位是4字节。
p+3-p,你等式左边的算法是在数组里的单位,既一格一格移动;
=12,你右边的是按照地址的实际大小得出的。
两边表示的不是一种单位啊。。。
还有就是这种理论上的东西你越想越糊涂,实际去写一个测试程序,把指针指向的地址打出来看看 不久知道了?
首先:
float a[10],*p,*q;
p=&a[4],q=&a[7];
那q-p=2(a[4]与a[7]之间有两个元素) ***这里就不对了,q-p = 3 不是等于2,
可以用printf("%d",q-p);看看。
p+3-p = 12 是地址按“字节”排列的位置差,表示p+3和p之间有12个字节
q-p = 3 表示q和p之间有3个float类型的数据,每个占4字节,3x4 = 12 和上面的结果一致
嗯,没错,对指针的加减运算是以步长为单位的,不过这是对编译器来讲的。但是对于机器来讲,指针也是二进制数据,在机器内对它们进行运算和一般的数据是一样的,只是因为编译器知道它们是指针,所以编译器告诉你的是指针之间的步长。以下是一个测试的程序,应该能说明问题吧,仅供参考:
#include
#include
void main()
{
float a[10],*p,*q;
p=&a[4];
q=&a[7];
printf("p: 0x%0xd\n", p);
printf("q: 0x%0xd\n", q);
printf("p-q: %d\n", p-q);
printf("p+3-p: %d\n", p+3-p);
system("pause");
}
所谓p+3-p=12只是个说法而不是语法。
如果你把地址当整数那么它们的差是12. 如果你把地址当float* 他们的差就是3