将void指针增加一个字节?两个?

时间:2011-06-23 06:02:27

标签: c++ c pointers

我有一个名为ptr的void指针。我想将这个值增加几个字节。有没有办法做到这一点?

请注意,我希望在不创建任何变量的情况下就地执行此操作。

我可以做ptr = (void *)(++((char *) ptr));吗?

4 个答案:

答案 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)));