【问题标题】:Can I use pointer arithmetic on pointers to void pointers?我可以在指针上使用指针算术来指向 void 指针吗?
【发布时间】:2018-09-06 02:53:24
【问题描述】:

我知道你不能在 void 指针上使用指针运算,但是理论上你可以对指向 void 指针的指针进行指针运算吗,因为 sizeof(void *) 会得出一个指针在你的系统上占用多少字节的答案?

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    void* 上不允许使用指针运算,因为 void 是不完整的对象类型。

    来自 C 委员会草案 N1570:

    6.5.6 加法运算符
    ...
    2. 对于加法,两个操作数都应该是算术类型,或者一个操作数应该是指向完整对象类型的指针,另一个应该是整数类型。

    但在void** 上是允许的,因为void* 不是不完整的对象类型。它就像一个指向字符类型的指针。

    6.2.5 类型
    ...
    19. void 类型 包含一组空值; 这是一个不完整的对象类型,无法完成。
    ...
    28. 指向 void 的指针应具有与 相同的表示和对齐要求 指向字符类型的指针

    【讨论】:

    • 第二个引用并不真正相关;适用于完整类型的指针算术规则
    • 只是想表明指向 void 的指针是一个完整的类型。
    【解决方案2】:

    是的,指针算法适用于指向 void 指针 (void**) 的指针。只有void* 是特殊的,void** 不是。

    例子:

    void *arrayOfVoidPtr[10];
    void **second = &arrayOfVoidPtr[1];
    void **fifth = second + 3; // pointer arithmetic
    

    【讨论】:

    • 一些编译器允许将void * 算术作为扩展。其中一个例子是 gcc
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2016-03-20
    • 2015-01-15
    • 1970-01-01
    • 2011-01-14
    • 2016-03-21
    • 2021-04-29
    相关资源
    最近更新 更多