我有一个名为ptr
的void指针。我想将这个值增加几个字节。有没有办法做到这一点?
请注意,我希望在不创建任何变量的情况下就地执行此操作。
我可以做ptr = (void *)(++((char *) ptr));
吗?
答案 0 :(得分:60)
您无法对void指针执行算术运算,因为指针算术是根据指向对象的大小定义的。
但是,您可以将指针强制转换为char*
,对该指针进行算术运算,然后将其转换回void*
:
void* p = /* get a pointer somehow */;
// In C++:
p = static_cast<char*>(p) + 1;
// In C:
p = (char*)p + 1;
答案 1 :(得分:17)
无法对void
指针进行任何算术运算。
编译器不知道void
指针指向的项的大小。您可以将指针强制转换为(char *
)。
在gcc中有一个扩展名,它将void
的大小视为1
。所以可以在void*
上使用arithematic来添加一个以字节为单位的偏移量,但是使用它会产生不可移植的代码。
答案 2 :(得分:5)
只是增加void*
确实适用于gcc:
#include <stdlib.h>
#include <stdio.h>
int main() {
int i[] = { 23, 42 };
void* a = &i;
void* b = a + 4;
printf("%i\n", *((int*)b));
return 0;
}
它在概念上(并且正式)是错误的,所以你想要明确它:把它投射到char*
然后再回来。
void* a = get_me_a_pointer();
void* b = (void*)((char*)a + some_number);
这很明显你增加了几个字节。
答案 3 :(得分:-1)
你可以这样做:
++(*((char **)(&ptr)));