【发布时间】:2018-09-06 02:53:24
【问题描述】:
我知道你不能在 void 指针上使用指针运算,但是理论上你可以对指向 void 指针的指针进行指针运算吗,因为 sizeof(void *) 会得出一个指针在你的系统上占用多少字节的答案?
【问题讨论】:
我知道你不能在 void 指针上使用指针运算,但是理论上你可以对指向 void 指针的指针进行指针运算吗,因为 sizeof(void *) 会得出一个指针在你的系统上占用多少字节的答案?
【问题讨论】:
void* 上不允许使用指针运算,因为 void 是不完整的对象类型。
来自 C 委员会草案 N1570:
6.5.6 加法运算符
...
2. 对于加法,两个操作数都应该是算术类型,或者一个操作数应该是指向完整对象类型的指针,另一个应该是整数类型。
但在void** 上是允许的,因为void* 不是不完整的对象类型。它就像一个指向字符类型的指针。
6.2.5 类型
...
19. void 类型 包含一组空值; 这是一个不完整的对象类型,无法完成。
...
28. 指向 void 的指针应具有与 相同的表示和对齐要求 指向字符类型的指针。
【讨论】:
是的,指针算法适用于指向 void 指针 (void**) 的指针。只有void* 是特殊的,void** 不是。
例子:
void *arrayOfVoidPtr[10];
void **second = &arrayOfVoidPtr[1];
void **fifth = second + 3; // pointer arithmetic
【讨论】:
void * 算术作为扩展。其中一个例子是 gcc