Форум программистов, компьютерный форум CyberForum.ru

Как происходит присвоение значения переменной? - C++

Восстановить пароль Регистрация
 
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
03.09.2015, 09:58     Как происходит присвоение значения переменной? #1
Здравствуйте.
Какие способы присвоения значения существуют?
Расскажите пожалуйста, как присваиваются значения при присвоении из других переменных?
Можно ли выполнять присвоение с использованием указателей, что происходит в этом случае?
Спрашиваю о механизмах работы сего (хотя демонстрация методов желательна).
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.09.2015, 10:56     Как происходит присвоение значения переменной? #2
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Какие способы присвоения значения существуют?
А какие ты уже знаешь? Пытался ли сам что-то сделать? Если пытался - покажи примеры. Если попыток не было, то лучше обратиться к литературе, чтобы уяснить базовые понятия языка. А то можно опуститься и до вопросов вида "Как целочисленной переменной присвоить значение 42".
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
03.09.2015, 11:25  [ТС]     Как происходит присвоение значения переменной? #3
Цитата Сообщение от Tulosba Посмотреть сообщение
А какие ты уже знаешь?
Присвоение константного значения, присвоение значения переменной.
Вот так попробовал сделать:
C++
1
LPCSTR а = "dddd";
Что происходит в этом случае? Создается переменная, указатель на которую передается в a?

Меня интересует каким методом это происходит? Например при присвоении значения массиву данные переписываются посимвольно (побайтово или как то ещё) или для этой переменной переопределяется область в памяти? Я хочу получить понимание которым руководствоваться при написании программы, потому что сейчас когда имею переменные wchar_t* и std::wstring, например, в программе, то не понимаю что сделать чтобы присвоить одно другому,потому что не знаю как это будет происходить. Метод запоминания функций и методов не подходит для моей дырявой памяти, мне нужно понять принцип.
zer0mail
2187 / 1870 / 187
Регистрация: 03.07.2012
Сообщений: 6,660
Записей в блоге: 1
03.09.2015, 12:33     Как происходит присвоение значения переменной? #4
Вообще-то есть отладчики, которые показывают ассемблерный код и там видна вся кухня.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
03.09.2015, 12:40     Как происходит присвоение значения переменной? #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Для начала, стоит заметить, что LPCSTR это не стандартный тип, а по сути синоним, который вводит MS:
C++
1
typedef const char* LPCSTR;
Т.о. твой пример можно рассматривать как:
C++
1
const char* a = "dddd";
В данном случае "dddd" является строковым литералом, где он будет храниться определяется реализацией, но главное, что его нельзя пытаться изменять после компиляции программы:
2.14.5/12 The effect of attempting to modify a string literal is undefined.
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Создается переменная, указатель на которую передается в a?
Создается указатель a и ему присваивается адрес, по которому расположен строковый литерал "dddd".
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Например при присвоении значения массиву данные переписываются посимвольно
Надо различать присваивание и инициализацию.
C++
1
2
3
int a[] = {1, 2, 3}; // массив можно инициализировать
int b[] = {4, 5, 6}; 
a = b; // но нельзя присвоить ему другой массив
В общем случае чтобы переписать значения элементов одного массива в другой нужно выполнить поэлементное присваивание.
Цитата Сообщение от VoltDeMar Посмотреть сообщение
переменные wchar_t* и std::wstring
Надо всего лишь понимать различия в типах:
wchar_t* - обычный указатель на широкий символ. У такого указателя нет ни конструктора, ни деструктора, ни других функций-членов. Что будет расположено по этому указателю зависит от соглашений. Это может быть как единичный широкий символ, так и строка (последовательность символов, заканчивающаяся нулевым символом L'\0');
std::wstring - полноценный объект, со всеми вытекающими (наличие функций-членов, данных и т.д.)
Цитата Сообщение от VoltDeMar Посмотреть сообщение
чтобы присвоить одно другому
Для инициализации объекта std::wstring (как и любого другого сложного объекта) нужно использовать конструктор. Например:
C++
1
2
const wchar_t* wp = L"some string";
std::wstring ws(wp); // вызов конструктора
Чтобы из строки std::wstring получить указатель (const wchar_t*) достаточно вызвать функцию-член c_str():
C++
1
const wchar_t* wp2 = ws.c_str();
Но здесь стоит понимать, что c_str() возвращает указатель не некое внутреннее представление строки в объекте, т.к. явно писать данные по такому указателю нельзя (собственно const об этом говорит), а так же нельзя использовать эти данные после любого модифицирующего метода из std::wstring:
C++
1
2
3
4
const wchar_t* wp2 = ws.c_str();
// пока ещё можно использовать wp2 на чтение
ws.resize(100);
// здесь уже нельзя использовать wp2 т.к. ws изменился
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Метод запоминания функций и методов не подходит для моей дырявой памяти, мне нужно понять принцип.
Это для всех так
VoltDeMar
 Аватар для VoltDeMar
16 / 16 / 0
Регистрация: 05.06.2012
Сообщений: 1,015
03.09.2015, 15:18  [ТС]     Как происходит присвоение значения переменной? #6
Цитата Сообщение от zer0mail Посмотреть сообщение
Вообще-то есть отладчики, которые показывают ассемблерный код и там видна вся кухня.
Изучение ещё одного языка наверное не самый быстрый способ понять такие вещи)
Yandex
Объявления
03.09.2015, 15:18     Как происходит присвоение значения переменной?
Ответ Создать тему
Опции темы

Текущее время: 09:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru