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ますか?dereferencingまた、暗黙的にポインタ演算を行っている場合、voidポインタが不可能なのはなぜですか。

4

1 に答える 1

9

Cは、ポインター型を使用したポインター演算を許可しませんvoid *

GNU Cは、のサイズを考慮することでそれを可能にしvoidます1

6.23からvoid-およびFunction-Pointersの算術

GNU Cでは、voidへのポインターと関数へのポインターで、加算および減算操作がサポートされています。これは、ボイドまたは関数のサイズを1として扱うことによって行われます。

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

今、この質問に答えるために:

また、ポインタ演算を暗黙的に実行している場合、voidポインタの間接参照が不可能な理由。

GNU Cはでポインタ演算をvoid *許可しますが、それでも型のオブジェクトをvoid宣言することはできません。

于 2012-10-28T21:45:16.523 に答える