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 に答える