对指针加一或者减一并不是简单的加减运算,而是以基类型数据所占有的字节数为步长的,例如下面:float a[10],*p;p=&a[4];既指针变量p指向了数组a中下标为4的元素。假如p=2000,那么p+1=2004而不是2001,且p+1指向的是a[5],p+3=2012,p+3指向的是a[7],p+3-p=12。但是两个指向同一个数组的指针变量是可以进行大小比较的,两个指针相减,得到的数据是两个指针之间的元素个数。如果我将以上例子做如下改变float a[10],*p,*q;p=&a[4],q=&a[7];那q-p=2(a[4]与a[7]之间有两个元素)与第一个式子p+3-p=12矛盾!!!请高人指点我的理解哪里错了
3 回答
ABOUTYOU
TA贡献1812条经验 获得超5个赞
嗯,没错,对指针的加减运算是以步长为单位的,不过这是对编译器来讲的。但是对于机器来讲,指针也是二进制数据,在机器内对它们进行运算和一般的数据是一样的,只是因为编译器知道它们是指针,所以编译器告诉你的是指针之间的步长。以下是一个测试的程序,应该能说明问题吧,仅供参考:
#include<stdio.h>
#include<stdlib.h>
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");
}
- 3 回答
- 0 关注
- 1033 浏览
添加回答
举报
0/150
提交
取消