2009-07-16 18 views
0

私は現時点でC++を学んでおり、ポインタを使って問題を解決しようとしています。誰もが次のシナリオ説明することができる:(名前が示すように)C++ポインタの問題

bool testFalse = false; //testFalse = false 
bool *thisIsFalse = &testFalse; //value of address of thisIsFalse shows that the address contains false 
bool shouldBeFalse = &thisIsFalse; //shouldBeFalse = true is what I get here 

shouldBeFalseをfalseにする必要があり、それは確かにそのように判明していません。誰かがそれが本当のように終わる理由と正しい方法でそれを作る方法を説明することができますか?ありがとう!

答えて

7

あなたが使用する必要があります& *を使用している:

bool shouldBeFalse = *thisIsFalse 
+0

D'oh!ありがとう:) –

+1

ようこそ。他の誰もが指摘しているように、&は変数のアドレスを取得するためのものです(&testと同じように)。*(* thisIsFalseのように)変数に適用された場合、逆参照(例:アドレスから値を取得) –

1

thisIsFalseは可変であり、かつ&thisIsFalseは、その変数のアドレスです。アドレスは0ではないので、真であるとboolにキャストされます。私はあなたがその行で何をしようとしているのか分かりません。おそらくあなたはこれを意味しましたか?ブール値について話をするためには

bool shouldBeFalse = *thisIsFalse;

0

、あなたはポインタ(*)を間接参照し、そのアドレス(&)を服用してはいけません。

bool shouldBeFalse = *thisIsFalse; 
2

あなたが何をしようとして、必ずしも明らかではないが、私の推測では、あなたが実際に(即ち、尖った値を取得)ポインタデリファレンスしたかったということでしょう。このためには、オペレータ*、ない&必要があります。

bool shouldBeFalse = *thisIsFalse; 

あなたのコードが何をしたかをポインタへのポインタを生成する代わりに、変数thisIsFalseのアドレスを取得しました。現在C++では、ポインタがNULLの場合は "false"、そうでない場合は "true"とみなされます。 boolが必要なポインタを渡すと、コンパイラは暗黙的にポインタをboolに変換します。そこに非NULLポインタがあるので、それはtrueに変換されました。

1

のアドレスは、thisIsFalseという変数をshouldBeFalseに割り当てます。あなたがすることは、逆参照thisIsFalseです。具体的には、thisIsFalse変数は非ヌル(非ゼロ)のメモリ位置に格納されているので、trueと評価されます。

bool shouldBeFalse = *thisIsFalse; // now it really is false 
0

testFalsefalseの値を割り当てるブール値です。

thisIsFalseはブールへのポインタであるとtestFalseのアドレス(私はあなたが&testFalseなく&testを入力することを意味想定)に等しい値が割り当てられます。これは、*thisIsFalseを使用する場合、testFalse(この場合はfalse)によって格納された値を指していることを意味します。 testFalseの値をtrueに変更すると、*thisIsFalsetrueになります。

shouldBeFalseはブール値ですが、アドレスにはthisIsFalseの値を割り当てています。このアドレスはゼロ以外の値で、C++では0以外の値はtrueと見なされるので、shouldBeFalseは今度はtrueになります。

代わりにshouldBeFalseに参照先の値thisIsFalseを割り当てるように最終行を変更する必要があります。

bool shouldBeFalse = *thisIsFalse; 
0

symolsを単語に翻訳して、正確に記述している内容を理解すると便利です。

等号の右側にある場合は、 "the address of"で'&'を置き換えて'*'と置き換えてください。あなたはこれをやっていれば

あなたは次のようにverbalyあなたのコードを読んでいるだろう:

#testFalse is False; 
#thisIsFalse is **the address of** testFalse; 
#shouldBeFalse is **the address of** thisIsFalse; 

をしかし、何を望んでいたことだった。

#shouldBeFalse is **the value pointed to by** thisIsFalse; 

をそこからは'*'の役割を覚えているのは簡単だし、 '&'だから、あなたはそれを再び翻訳することができます:

bool shouldBeFalse = *thisIsFalse;