2016-06-12 13 views
-9

関数の受け渡しでC++文字列ポインタがどのように機能しているのか理解できません。ポインタで関数を渡すC++文字列

void print(string str){ 
    str+=" and sisters."; 
} 
int main(){ 
    string s ="hello brother"; 
    print(s); 
    cout<<s<<endl; 

}

出力:

hello brother 

と機能以下のために -

void print(string &str){ 
    str+=" and sisters."; 
} 
int main(){ 
    string s ="hello brother"; 
    print(s); 
    cout<<s<<endl; 
} 

出力 -

hello brother and sisters. 

同じ文字列オブジェクトを渡しているので、ポインタ "string & str"と "string str"の場合にポインタがどのように動作しているのか理解できません。

+1

コードにポインタはありません。値渡しの参照渡しの問題です。参照渡しや値渡しのどちらを優先すべきですか?(http://stackoverflow.com/questions/4986341/where-should-i-prefer-pass-by-reference-or-pass- – songyuanyao

+3

これは、書籍を読んだり、お気に入りのオンラインチュートリアルの5ページに行くことで簡単に答えられます。 – DeiDei

答えて

0

あなたのプログラムにはポインタはありません。代わりに、2番目のプログラムでは、関数の引数はの参照です。

参考文献を参照してください。例の場合、引数はmainの変数sを参照します。最初のプログラムで

あなたはそれがをコピーされ、関数は文字列のみの独自のローカルコピーを変更を意味し、値によって引数を渡します。

最初のプログラムでは、2つの異なるstringオブジェクトがありますが、一方を変更するともう一方は変更されません。 2番目のプログラムでは、1つの単一のstringオブジェクトのみが作成され、コピーは作成されず、両方の変数が同じオブジェクトを参照します。

0

アンパサンド&はポインタではないので、pass the variable by referenceを意味します。

最初の例では、値渡しです。これは本質的にコピーです。それはメモリ内の異なるアドレスを持ち、関数が終了すると破壊されます。このため、and sisters.printに追加したにもかかわらず、出力としてhello brotherしか表示されません。

あなたが持っているとしたら:

void print(string str){ 
    str+=" and sisters."; 
    cout << "print: " << str << '\n'; 
} 

をあなたは機能を終了した後、これらの変更は破棄され、

print: hello brother and sisters. 

ただし、出力を見ること、そしてこれはあなたが取得している理由でありますmainに表示される出力

2番目の例では、メインの文字列sが格納されている場所への参照を渡しています。コピーではなく、後続の機能で行われた変更はmainで表示されます。これは、文字列sの変更がprintになると、その関数を終了すると変更が残り、このため完全な文字列hello brother and sisters.が表示されることを意味します。

0

通常、C++は値渡しです。つまり、関数に渡されるのは式の値です。たとえば:

int add(int i) 
{ 
    i = i + 1; 
    return i; 
} 

int j = 1; 
cout << add(j); 

は、我々は出力2にこれを期待するべきである。しかしjの値は、我々がaddに(1)でjの値を渡され、まだ1です。同様に、add(8)は9を返しますが、コード内のリテラル8を何らかの形で9に変換しません。

ただし、C++ではパス渡しもサポートされています。参照渡しでは、その値ではなくオブジェクトの比喩的な位置を渡します。例:ここでは

int add(int& i) 
{ 
    i = i + 1; 
    return i; 
} 

int j = 1; 
cout << add(j) 

、我々は、jにない、その値をadd参照を渡します。その参照のターゲットを操作すると、jが操作されます。この場合、add(8)は不正となり、コンパイラエラーが発生します。

2つの変数の名前が同じかどうかは関係ありません。私は彼らが私が参照していたものを特定するのを簡単にするために、彼らに異なる名前を付けました。

また、これはポインタとは関係ありません。ポインタ変数は、他のオブジェクトのアドレスである値を持ちます。彼らはまた、価値によってまたは参照によって渡すことができます。

関連する問題