3
int main()  
{  
    int a;  
    void *p;  
    p = &a;  
    printf("%ld\n",(long)p);  
    p = p+1;  
    printf("%ld\n",(long)p);  
}  

在这个程序中,p+1只是将 p 的值增加 1。我知道void pointer arithmetic在 中是不可能的C,所以GCC隐式地这样做。如果是,那么它是否将其视为char pointer. 此外,如果 void 指针隐式进行指针运算,为什么dereferencing它不可能。

4

1 回答 1

9

C 不允许void *指针类型的指针算术。

GNU C 通过考虑 is 的大小来允许void1

6.23 对 void 和 Function-Pointers 的算术

在 GNU C 中,指向 void 的指针和指向函数的指针支持加法和减法运算。这是通过将 void 或函数的大小视为 1 来完成的。

http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html

现在来回答这个问题:

此外,如果 void 指针隐式地进行指针运算,为什么不能取消引用。

GNU C 允许使用指针算术,void *但仍然不允许void声明类型的对象。

于 2012-10-28T21:45:16.523 回答