2

以下の 2 つのコピー機能の違いは何ですか? それらの間に違いはないようです。具体的には、void*& と void* の比較です。

では、T*& と T* の違いは何でしょうか? いつどちらを使用するのですか?また、const パラメータを受け入れるようにするとどうなりますか? 違いは何ですか?

#include <iostream>

void Copy(void* Source, void* Destination, int Size)
{
    //memcpy(Destination, Source, Size);
    char* S = static_cast<char*>(Source);
    char* D = static_cast<char*>(Destination);
    *D = *S;
}

void Copy2(void* &Source, void* &Destination, int Size)
{
    char* S = static_cast<char*>(Source);
    char* D = static_cast<char*>(Destination);
    *D = *S;
}


int main()
{
    int A = 2;
    int B = 5;
    int C = 7;

    void* pA = &A;
    void* pB = &B;
    void* pC = &C;

    Copy(pA, pB, 1);
    Copy2(pA, pC, 1);

    std::cout<< B <<std::endl;
    std::cout<< C <<std::endl;
}

上記の両方が「2」を出力します。どちらも同じじゃない?

4

1 に答える 1

7

1 つはポインタで、もう 1 つはポインタへの参照です。

両方を Google で調べて、C++ の基礎に関する本を手に取ってください。

ポインターによる受け渡しは、メモリ アドレスを値 (つまり、コピー) で渡すことと考えてください。受信関数では、メモリ アドレスのコピーがあり、そのメモリ アドレス ポインタが指す場所と、宛先メモリの内容がどのように見えるかを変更できます。その関数から戻ると、宛先メモリは変更されていますが、元のポインターは変更されていません。

対照的に、ポインターへの参照を使用すると、関数から戻った後にそのメモリが指す場所を変更できます。それ以外は同じです。

一般的な使用法は、次のようなメモリを割り当てる関数です。

SomeClass *someClass = null;
PopulateSomeClass(someClass);
...

void PopulateSomeClass(SomeCLass* &someCLass)
{
   someClass = new SomeClass;
}

しかし、実際には、これをググって詳細を確認してください。これは、より基本的な C++ の概念です。

たとえば、参照は通常、コンパイラの内部で const * として実装されます。したがって、ポインターへの const ポインターです。

于 2012-12-24T03:44:33.410 に答える