2014-01-16 2 views
0

Я только начал изучать C++ (я сейчас больше разработчиков Java), и я с некоторой путаницей с использованием указателей ... например, следующий код работаетпутаются указатели

int main() { 
    int x = 5; 
    int * y; 
    y = &x; //note this line of code 
    *y = 10; 
} 

в то время как это код не работает

int main() { 
    int x = 5; 
    int * y; 
    y = x; 
    *y = 10; 
} 

Может кто-нибудь объяснить мне, почему получать значение «расположение» с помощью y = &x работает, но как только я заменить его y = x это вызывает ошибку. Если кто-нибудь знает о хорошем объяснении указателей, пожалуйста, поделитесь ссылкой :)

Спасибо!

+4

Указатели магазина адреса. 'x' является целым числом. '& x' - это адрес. – chris

+2

y является указателем, и вы устанавливаете его в 'int'.Это технически законно, но разыгрывает этот указатель, который приведет к хауку, так как нет определенного места в памяти «10» « – zero298

+0

Я вижу ... это займет некоторое время, чтобы привыкнуть полностью, спасибо за отзыв –

ответ

7

Давайте посмотрим, как это работает с указателями.

int x = 5; 

Вы назначаете значение 5 в x, которое является int.

int *y; 

Вы объявляете указатель на int.

y = &x; 

Теперь адрес, хранящийся в y, совпадает с адресом x.

Но если вы это сделаете: y = x, вы назначаете целое число (5 в этом случае) переменной, которая содержит адресов целых чисел.

Наконец, вы должны помнить, что:

  • & является адресом-оператора, и может быть прочитана как «адрес»
  • * является оператором косвенного, и может быть прочитана как " значение указывает»

Tutorial about pointers

+2

«Теперь адрес y совпадает с адресом x». - Вы используете «адрес' y' »для обозначения адреса, хранящегося в' y'. Совсем смущает. –

+1

Кроме того, я знаю, что вы взяли это с cplusplus.com (еще один пример того, что он вводит в заблуждение информацию), но '&' лучше всего называют адресом оператора и '*' оператором косвенности. Терминологию, которую вы и они использовали, можно легко путать с терминологией для ссылочных типов. –

+0

@sftrabbit адрес-имеет смысл, но можете ли вы объяснить, что подразумевается под косвенностью? Почему это называется? – Trojan

0

y является указателем на int. xявляется a int. Поэтому всякий раз, когда вы устанавливаете y=x, вы сообщаете y, что всякий раз, когда он разыгрывается, он должен искать место памяти 10 (или что-то еще x находится во время назначения). И, вероятно, нет выделения памяти на 10. Или, по крайней мере, не то, что вы ожидаете. Если вы хотите получить местонахождение x, получите указатель на него с &x.

int main() { 
    int x = 5; 
    int * y; 
    y = &x; // <-- NOTE THE "&" WHICH MEANS GET REFERENCE 
    *y = 10; 
} 
0

Указатель - это переменная, которая содержит ячейку памяти. В вашем экземпляре переменная «x» содержит значение 5, где переменная y содержит место в памяти. «&» оператор позволит вам использовать местоположение в памяти «х» переменной

cout >> x; //will give you an output of 5. 
cout >> &x; //will give you an output of the memory location of the variable x. 

y = &x; 
cout >> y; //will give you an output of the memory location of the variable x. 
Смежные вопросы