给定一个void
指针,如果我想让void
指针指向前面的x
字节,那么最好如何做到这一点?有没有比投射到char
指针更好的方法?
答案 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 question和this 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
)...
所以只要你知道你在做什么,就没有问题。