为什么将void指针递增1会向前移动一个字节,但对于整数指针,它是4个字节,对于double是8?

时间:2013-05-02 11:20:31

标签: c pointers void-pointers pointer-arithmetic

在下面的程序中,如果我向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);
}

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

void*只不过是unsigned intDWORD这样的数据类型。数据类型void*只是提醒我们它拥有的值是一个地址。在void*上完成的任何算术(允许的算术)与unsigned intDWORD上的算术类似。