2012-09-25 49 views
1

我無法推進作爲參數傳入的指針。想法是該函數將讀取指針處的值並使指針前進。我需要通過參考傳遞嗎?是否可以通過引用傳遞指針?C++ - 推進作爲參數傳遞的指針

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

該功能可以讀取值和推進本地指針,但我希望它前進的一個傳入。

+0

爲什麼'sizeof(uint32)'而不是'sizeof(int32)'(或更好,sizeof(value)')? –

+0

@ R.MartinhoFernandes固定。謝謝。 –

+0

是的,這是可能的,而且這是你必須在這裏做的。 – Jon

回答

1

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是一個const char*參考。因此,雖然您可以更改指針,但無法更改指向的內容。這正是你在這種情況下想要的。

您不應該通過「請求更改傳遞引用的行爲」(通過編譯器選項)來更改行爲。這使得你的代碼不可移植,非標準和非人類可讀(除了那些知道...的人)。

1

是的,是的。除非您明確請求傳遞引用,否則所有參數(包含的指針)均按值傳遞,這意味着更改參數的值不會更改可能用作函數參數的任何變量的狀態。

1

你必須參考

int32 File::readDWORD(char* & offset) 
{ 
    [...] 
    offset += sizeof(uint32); 
    [...] 
} 
2

通過它您可以通過引用傳遞指針,或將指針傳遞指針(句柄)。這兩種解決方案都允許您修改指針的值,以便指向它的位置。

但是請注意,通常你不應該在C++中使用「原始」指針。您提出的內存操作可以用更高級別的語言結構替換;我能想到的就是更好地封裝你的File類,以一種可能類似於流的方式。

這可能會導致另一個問題 - 爲什麼不使用std::fstream