2
struct anup1 {
    int a;
};
void structpass_1(struct anup1 b) // accepting structure
{
    cout << b.a;
};
void structpass_2(struct anup1& b) // accepting address of a structure
{
    cout << b.a;
};

int main() {
    struct anup1 a2;
    a2.a = 100;
    structpass_1(a2);
    structpass_2(a2);
}

上記のコードは同じ出力を提供します...受け入れるパラメーターが構造体/構造体のアドレスであるかどうか。

誰でも私にこの振る舞いを説明してもらえますか?

ありがとう

4

6 に答える 6

3

struct anup1 への参照を関数に渡します。

void structpass_2( struct anup1 &b)

参照とは何かを見てください:参照

また、関数のパラメーター リストにキーワードstructは必要ありません。次のように記述できます。

void structpass_1(anup1 b) // accepting structure
void structpass_2(const anup1& b) // accepting address of a structure

const読み取り専用の場合は、パラメーターに修飾子を追加します

于 2013-01-18T22:17:04.337 に答える
2

structpass_1あなたの構造ではvalueanup1で渡されるので、ローカルコピーが行われて関数に渡されます。

代わりに、 in structpass_2the structure is passed by reference、つまり、構造体インスタンスへのポインターが関数に渡されます (ポインターのセマンティックですが、値の構文があります)。構造全体のローカル コピーは行われません。

1 つの整数のみを含む単純な構造の場合、値渡しまたは参照渡しはパフォーマンスの観点から同じであることに注意してください。しかし、より複雑な (そしてより大きな) データがある場合は、参照渡しの方が効率的です。

値による受け渡しと参照による受け渡しの 2 つのケースの重要な違いは、関数本体内の構造体インスタンスを変更する場合、構造体が参照によって渡される場合にのみ、変更が呼び出しサイトで永続化されることです。代わりに、構造体を値で渡すと、ローカル コピーが関数本体内で行われるため、関数が終了すると変更が失われます。例えば:

void structpass_1(anup1 b) // pass by value
{
    cout << b.a << '\n';
    b.a++; // modification lost at the call site
};

void structpass_2(anup1& b) // pass by reference
{
    cout << b.a << '\n';
    b.a++; // the caller will see the incremented value for b.a
};

int main() 
{
    anup1 a2;
    a2.a = 100;
    structpass_1(a2); // will print 100
    structpass_2(a2); // will print 100
    cout << a2.a; // willl print 101 (structure modified by structpass_2)
}
于 2013-01-18T22:31:07.023 に答える
2
void structpass_2( struct anup1 &b)

これは参考にしています。ポインターは*.

于 2013-01-18T22:16:44.680 に答える
1

2番目の機能

void structpass_2( struct anup1 &b)

C++ 構文では、参照渡しです。参照渡しは、単にオブジェクトのアドレスを関数に渡します。

最初の関数

void structpass_1(struct anup1 b)

値渡しを使用します。最初に構造体 a のコピーを作成し、次に関数に渡します。参照渡しの方が効率的です。

于 2013-01-18T22:18:22.070 に答える
0

これらの関数はプログラマーにとって同等であり、唯一の違いは基礎となるマシン コードにあります。最初の関数はコピー (オブジェクト) を操作し、2 番目の関数は参照 (実際にはポインター) を介して元のオブジェクトを操作します。

得られる出力は 100% 正しいです。

于 2013-01-18T22:19:33.947 に答える
0

簡単に言えば、最初のものはオブジェクトの正確なコピーを作成します。これはコードの最適化に役立ちますが、元のオブジェクトを変更したくない場合はconstを使用することを忘れないでください。

于 2013-01-18T22:44:02.707 に答える