2

我无法推进作为参数传入的指针。想法是该函数将读取指针处的值并推进指针。我需要通过引用传递它吗?甚至可以通过引用传递指针吗?

int32 File::readDWORD(char* offset)
{
    int32 value;
    memcpy(&value, offset, sizeof(int32));
    offset += sizeof(int32);
    return value;
}

该函数读取值并推进本地指针,但我希望它推进传入的指针。

4

4 回答 4

3

您可以通过引用传递指针,也可以将指针传递给指针(句柄)。这两种解决方案都允许您修改指针的值,即它指向的位置。

但是请注意,通常您不应该在 C++ 中使用“原始”指针。您提出的内存操作可以替换为更高级的语言结构;我能想到的是以一种可能类似于流的方式更好地封装您的 File 类。

这可能会导致另一个问题——你为什么不直接使用std::fstream

于 2012-09-25T11:02:53.997 回答
2

是的

int32 WLD::readDWORD(const char*&offset)
{
    int32 value;
    memcpy(&value, offset, sizeof(int32));
    offset += sizeof(int32);
    return value;
}

char*pter = initial;
WLD::readDWORD(pter);
assert(pter == initial+sizeof(int32));

offset是对 a 的引用const char*。因此,虽然您可以更改指针,但您无法更改它所指向的内容。在这种情况下,这正是您想要的。

您不应该通过“请求更改行为以通过引用传递”(通过编译器选项)来更改行为。这使您的代码不可移植、非标准和非人类可读(除了那些知道的人......)

于 2012-09-25T10:58:33.937 回答
1

是的,是的。除非您特别请求按引用传递,否则所有参数(包括指针)都按值传递,这意味着更改参数的值不会改变任何可能用作函数参数的变量的状态。

于 2012-09-25T10:58:34.257 回答
1

你必须通过引用传递它

int32 File::readDWORD(char* & offset)
{
     [...]
     offset += sizeof(uint32);
     [...]
}
于 2012-09-25T10:59:38.380 回答