空指针算法

时间:2010-07-31 11:57:05

标签: c++

给定一个void指针,如果我想让void指针指向前面的x字节,那么最好如何做到这一点?有没有比投射到char指针更好的方法?

7 个答案:

答案 0 :(得分:17)

  

有没有比投射更好的方法   一个字符指针?

否(除了char *而不是void *开头,所以你根本不必投出它。)

如果这不可取或不可能,那么唯一的方法是:

ptr = static_cast<char *>(ptr) + offset;

(注意:如果你在C ++中做这类事情,通常有一个更好的解决方案。除非你是专家,你已经排除了其他所有选择,我建议你发布一个新的问题,询问是否有更好的方法来做你想要做的事情!)

答案 1 :(得分:4)

  

给定一个void指针,如果我想让void指针指向前面的x字节,那么最好如何做到这一点?有没有比投射到char指针更好的方法?

如果您有void*,则不知道“x bytes ahead”是有效地址。您不知道创建这样的指针不会导致程序崩溃。

这就是void*无法完成的原因。

您只能在指向数组的指针上执行指针算术。如果你有一个指向数组的指针,你知道数组的类型,并且可以使用等效的指针类型。

如果你想要某种抽象的“字节指针”(比如,如果你正在实现一个内存池并且需要指向缓冲区中的特定偏移量),你应该使用char*或{{1 }},而不是unsigned char*

答案 2 :(得分:2)

查看this questionthis question。总而言之,答案是在字节级转换为char *算术。

答案 3 :(得分:2)

当做指针算术时,编译器想要考虑它对指针指向的类型的了解。

例如,如果您有int *myint。然后这两个陈述实际上做了同样的事情:

int a = *(myint+5);

int a = myint[5];

在这种情况下myint+5并不意味着“myint的地址加上5”,而是“myint的地址加上5 * sizeof(int))”

因此,在void *的情况下,编译器无法做出void * + 5应该表示的任何假设。因此,在使用void *之前,它会强制您指定如何使用它。

答案 4 :(得分:0)

您可以将指针转换为普通整数,进行增量或其他操作,然后可以将整数分配给该指针,希望对您有所帮助

答案 5 :(得分:-1)

这是我的问题

void *inputAudioBuffer;

c ++不允许我这样做

UInt16 *inputBuffer = (UInt16 *)(inputAudioBuffer + inputBufferOffset);

做了类型演员之后我就能做到了

UInt16 *inputBuffer = (UInt16 *)( (UInt16 *) inputAudioBuffer + inputBufferOffset);

答案 6 :(得分:-2)

与回答这个问题的其他人不同,在我看来,好像一个简单的+x(根本没有转换)足以访问void指针前的地址x字节。编译器可能不喜欢它,但至少在我使用它的情况下,它已经有效了。我正在使用g++gcc)...

所以只要你知道你在做什么,就没有问题。