如果两个指针指向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目。 假设我住在广场路124号,Mag住在广场路142号,每家之间的地址间距是2(在我这一侧用连续的偶数作为街道地址),那麽Mag家就在我家往前(142-124)/2家,也就是说可以得到我们两家之间相隔8家。 也就是说可以利用两个指向同一数组的指针相减得到两个指针之间元素的个数。 如果两个指针不是指向同一个数组,它们相减就没有意义了。 C本身无法防止非法的指针减法运算,它无法为你提出任何警告或提示。 指针相减的结果是某种整类型的值,为此,ANSI C标准<stddef.h>头文件中预定义了一个整类型ptrdiff_t。尽管在不同的编译程序中ptrdiff_t的类型可能各不相同,但它们都适当地定义了ptrdiff_t类型。 把指针强制转换成指向纯粹的内存地址的指针,通常就是转换成void*类型,但是在本例中将指针强制转换成char*类型,因为void*类型的指针之间不能进行减法运算。 |
#include <stdio.h>
#include <stddef.h>
struct stuff{
char name[16];
};
struct stuff array[]={
{"The"},
{"quick"},
{"brown"},
{"fox"},
{"jumped"},
{"over"},
{"the"},
{"lazy"},
{"dog."},
{""}
}
main()
{
struct stuff *p0= & array[0];
struct stuff *p8= & array[8];
ptrdiff_t diff=p8-p0;
ptrdiff_t addr_diff=(char*)p8-(char*)p0;
printf("&array[0]=p0=%P/n",(void*)p0);
printf("&array[8]=p8=%P/n",(void*)p8);
printf("The difference of pointers is %ld/n",(long)diff);
printf("The difference of addresses is %ld/n",(long)addr_diff);
printf("p8-8=%P/n",(void*)(p8-8));
printf("p0+8=%P(same as p8)/n",(void*)(p0+8));
return 0;
}
|
本例演示了指针的减法运算。该例中有一个结构体数组,每个结构体的长度都是16字节。如果是对指向结构体数组的指针进行减法运算,则a[0]和a[8]之 间的距离为8,如果将结构体数组的指针强制转换成指向纯粹的内存地址的指针之后再相减,则a[0]和a[8]之间的距离为128。如果将指向a[8]的指 针减去8,该指针所指向的位置并不是往前移了8个字节,而是往前移了8个数组元素。 |
两个指针相减
最新推荐文章于 2024-06-11 19:28:26 发布