Проблема с указателем C ++ - PullRequest
0 голосов
/ 16 июля 2009

Итак, я сейчас изучаю 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 (как следует из названия) должно быть ложным, но это, безусловно, не так. Может ли кто-нибудь объяснить, почему это оказывается правдой и как сделать так, чтобы оно приобрело правильную ценность? Спасибо!

Ответы [ 7 ]

7 голосов
/ 16 июля 2009

Вы используете и где вы должны использовать *:

bool shouldBeFalse = *thisIsFalse
2 голосов
/ 16 июля 2009

Не совсем понятно, что вы пытаетесь сделать, но я предполагаю, что вы на самом деле хотели разыменовать указатель (то есть получить указанное значение). Для этого вам нужен оператор *, а не &:

 bool shouldBeFalse = *thisIsFalse;

Вместо этого ваш код взял адрес переменной thisIsFalse, создав указатель на указатель. Теперь в C ++ указатели считаются «ложными», если они равны NULL, и «истиной» в противном случае; и компилятор неявно преобразует указатель в bool по этим правилам, если вы передадите указатель, где ожидается bool. Поскольку там был указатель, отличный от NULL, он был преобразован в true.

1 голос
/ 16 июля 2009

То, что вы здесь сделали, это присвоение адреса thisIsFalse переменной shouldBeFalse. То, что вы хотели сделать, это разыменование thisIsFalse. В частности, поскольку переменная thisIsFalse хранится в ненулевой (ненулевой) ячейке памяти, тогда она оценивается как true.

bool shouldBeFalse = *thisIsFalse; // now it really is false
1 голос
/ 16 июля 2009

thisIsFalse - это переменная, а &thisIsFalse - это адрес этой переменной. Поскольку адрес не равен 0, он преобразуется в bool как истина. Я не уверен, что ты собирался с этой строкой .. Возможно, вы имели в виду это?

bool shouldBeFalse = *thisIsFalse;

0 голосов
/ 16 июля 2009

Полезно перевести символы в слова, чтобы вы понимали, что именно пишите.

когда справа от знака равенства мысленно подставьте '*' с "значением, на которое указывает", а '&' с "адресом".

если бы вы сделали это, вы бы прочитали ваш код в устной форме следующим образом:

#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;
0 голосов
/ 16 июля 2009

testFalse - логическое значение, которому присвоено значение false.

thisIsFalse является указателем на логическое значение и ему присваивается значение, равное адресу testFalse (я полагаю, вы имели в виду &testFalse вместо &test) Это означает, что при использовании *thisIsFalse он будет указывать на значение, хранящееся в testFalse, в данном случае false. Если вы измените значение testFalse на true, то *thisIsFalse будет true.

shouldBeFalse - логическое значение, но вы присвоили ему значение, равное адресу thisIsFalse. Этот адрес является ненулевым значением, и в C ++ любое ненулевое значение считается true, поэтому shouldBeFalse теперь true.

Вместо этого вам следует изменить последнюю строку, чтобы присвоить shouldBeFalse разыменованное значение thisIsFalse, а не адрес.

bool shouldBeFalse = *thisIsFalse;
0 голосов
/ 16 июля 2009

Чтобы говорить о логических значениях, вы должны разыменовать ваш указатель (*), а не брать его адрес (&).

bool shouldBeFalse = *thisIsFalse;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...