【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

参照渡し と ポインタ渡し はどういう時に使い分けるんですか?

VOID型の自作関数内でメインのブール値を書き替えたいんだけど

#include <iostream.h>

void ref( int &b ) { b = false; }

void ptr( int *b ){ ( *b ) = true; }

main(){
 bool b = true;

 ref( b );
 cout << b;

 ptr( &b );
 cout << b;
}

だとコンパイルエラーでした。
うまくいくソースを教えてください。

A 回答 (2件)

#include <stdio.h>



// どちらも引数をインクリメントする
void ref(int a){a++;}
void ptr(int* a){(*a)++;}

int main()
{
int a = 0;

ref(a); --> aの値は変わらない
printf("%d\n",a); -->0が出力
ptr(&a); --> aの値は変わる
printf("%d\n",a); -->1が出力
returen 0;
}

簡単に言えば, 参照渡しはaの値をコピーして渡します.
ポインタ渡しは, aのアドレスをコピーして渡します.
なので, 参照で渡された引数をいくらいじったところで
呼出し元のaと別物ですから反映されません.
ポインタ渡しにすれば, 結局はおなじ変数を見ていることに
なるので, 呼出し元のaにも影響を及ぼすことになります.

つまり, 2種類の引数の渡し方は, 値の変更を呼出し元へ
反映させるか否かで使い分けることになります.

この回答への補足

void ref( int a ){ a++; }
だと、main に戻ったときに a の値に変化がないのは分かるけど
ref( a );
で呼び出して
void ref( int &a){ a++; }
にすると、a は変化します。これは何渡しというんですか?

補足日時:2002/05/28 23:13
    • good
    • 0

refとptrの引数の型が各々bool&とbool*である必要があります。


このままの関数定義で無理矢理キャストを行って実行すると、
不正なメモリアクセスが発生する危険が高いです。
(boolの実装によりますが。VCは5より前とそれ以降でsizeof(bool)が異なるそうです)
    • good
    • 0
この回答へのお礼

ありがとうございます。
元々intだったソースをboolに書き替えたんだけど、
2行目と3行目の、引き数の型を書き替えるのを忘れていました。

お礼日時:2002/04/23 06:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!