1

在下面的程序中,如果我给一个 void 指针加 1,它会向前移动一个字节。但是,正如预期的那样,它分别为 intdouble指针移动了 4 和 8 个字节。为什么 void 指针移动了 1 个字节,就像一个字符指针会?

#include<stdio.h>

int main(void)
{

        int num=3,*int_ptr=&num;
        double sum=3,*double_ptr=&sum;
        void *void_ptr1=&num,*void_ptr2=&sum;
        printf("%p,%p,%p,%p,%p,%p,%p,%p",void_ptr1,void_ptr1+1,\
        void_ptr2,void_ptr2+1,int_ptr,int_ptr+1,double_ptr,double_ptr+1);
}
4

3 回答 3

6

您不能对 void 指针进行指针运算(因为它没有意义)。可能只是你的编译器有一个扩展,允许在 void 指针上执行指针运算,它是这样实现的。但是,它既不是标准的,也不鼓励使用。

于 2013-05-02T11:22:34.590 回答
3

实际上,递增/递减void*未定义的行为,因为void*实际上是指向某种类型的指针。编译器不知道它应该如何增加 avoid*并且似乎使用了预定义的值。

因此,在递增之前,您必须将其转换为正确的类型。

于 2013-05-02T11:25:00.363 回答
0

void*只不过是一种数据类型,例如unsigned intor DWORD。数据类型void*只是提醒我们它持有的值是一个地址。在 上完成的任何算术(允许的)void*都类似于在unsigned intor上完成的算术DWORD

于 2013-05-02T11:46:33.613 回答