170 похожих чатов

Здравствуйте. Подскажите пожалуйста. Есть код. Схема структуры пропущена. Первая переменная

структуры string Name. Указал только то, что в int main(). Вот этот код:
Container C_Sam = { "Sam", 4,5,6 };

Container* C_SamPtr = &C_Sam;

cout << C_Sam.Name << endl;
cout << C_SamPtr->Name << endl;

Я ведь правильно понимаю, что в первом случаем будет создание временной копии объекта структуры и вывод члена-имени на экран? А во втором только вызов указателем конкретной переменной Name, не трогая остальные компоненты контейнера?
И еще, если я удалю строку

Container* C_SamPtr = &C_Sam;

то могу ли я совершить вызов переменной контейнера через указатель способом, показанным ниже?

cout << *&C_Sam.Name << endl;

10 ответов

16 просмотров

Всё ещё неправильно :( Оберните код в теги: 3 символа ` до и после кода (в случае одиночной конструкции достаточно 1 ` с обеих сторон). Спасибо!

Container* C_SamPtr = &C_Sam; cout << C_Sam.Name << endl; //(1) cout << C_SamPtr->Name << endl; //(2) (1) и (2) полностью эквивалентны

Andre1- Автор вопроса
Constantine Drozdov
Container* C_SamPtr = &C_Sam; cout << C_Sam.N...

Результат будет эквивалентен. Но сам способ его получения, разве он одинаков? Ведь во втором случае используется указатель

Andre1
Результат будет эквивалентен. Но сам способ его по...

С языковой точки зрения компилятор может преобразовать конструкцию (2) в то же самое, что (1) в этом примере

Да, заметьте, что объект C_Sam "трогается" только в смысле того, что с языковой точки зрения C_Sam должна быть переменной нужного типа во время её жизни; в реализации само по себе "вычисление" C_Sam.Name это будет простейшая арифметическая операция вычисления адреса поля Name по известному адресу C_Sam

А что имеется ввиду под вызовом всего контейнера?

Andre1- Автор вопроса
Nematode
А что имеется ввиду под вызовом всего контейнера?

не совсем верно написал. Вызов всего объекта структуры. Так будет правильнее

Andre1- Автор вопроса
Andre1
создание временной копии

На самом деле вызывается одна и та же перегрузка, просто в случае с указателем через нативный -> происходит разыменование указателя на поле name, которое, выведется в ссылку в аргументе шаблонной функции, как и в случае передачи по значению. А за кулисами << может быть копирование в буфер выходного потока. Но сам объект не копируется, ибо мы явно указали нужное нам поле

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
5
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Карта сайта