ссылочная переменная и проблема с указателем - PullRequest
1 голос
/ 09 августа 2011

У меня есть указатель, который указывает на целочисленную переменную. Затем я назначаю этот указатель на ссылочную переменную. Теперь, когда я меняю указатель на другую целочисленную переменную, значение ссылочной переменной не меняется. Кто-нибудь может объяснить, почему?

int rats = 101;
int * pt = &rats;
int & rodents = *pt;                                // outputs    
cout << "rats = " << rats;                          // 101
cout << ", *pt = " << *pt;                          // 101
cout << ", rodents = " << rodents << endl;          // 101
cout << "rats address = " << &rats;                 // 0027f940
cout << ", rodents address = " << &rodents << endl; // 0027f940
int bunnies = 50;
pt = &bunnies;

cout << "bunnies = " << bunnies;                    // 50
cout << ", rats = " << rats;                        // 101  
cout << ", *pt = " << *pt;                          // 50
cout << ", rodents = " << rodents << endl;          // 101
cout << "bunnies address = " << &bunnies;           // 0027f91c
cout << ", rodents address = " << &rodents << endl; // 0027f940

Мы присвоили pt кроликам, но ценность грызунов все еще равна 101. Пожалуйста, объясните почему.

1 Ответ

2 голосов
/ 09 августа 2011

Линия

int & rodents = *pt;

создает ссылку на то, на что указывает pt (т.е. rats). Это не ссылка на указатель pt.

Позже, когда вы назначите pt для указания на bunnies, вы не ожидаете, что ссылка rodents изменится.

РЕДАКТИРОВАТЬ: Чтобы проиллюстрировать точку @Als, рассмотрим следующий код:

int value1 = 10;
int value2 = 20;
int& reference = value1;
cout << reference << endl; // Prints 10
reference = value2; // Doesn't do what you might think
cout << reference << endl; // Prints 20
cout << value1 << endl; // Also prints 20

Второе присваивание reference не не меняет ссылку на себя. Вместо этого он применяет оператор присваивания (=) к упомянутой вещи, который является value1.

reference всегда относится к value1 и не может быть изменено.

Поначалу немного сложно разобраться, поэтому я рекомендую вам взглянуть на превосходные книги Скотта Мейера Effective C ++ и More Effective C ++ . Он объясняет все это гораздо лучше, чем я.

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