Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
1

const переменная

20.07.2013, 14:25. Просмотров 917. Ответов 14
Метки нет (Все метки)

Вопрос по коду ниже. Насколько я знаю const переменная, это переменная по имени которой нельзя перезаписывать область памяти. Я завёл указатель на такую переменную, который не const. Изменил значение в этой области памяти с помощью указателя. И вот что получил. Адресс который в ptr и a совпадают, но значения по этому адресу содержатся разные. Как так может быть?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    const int a = 2;
    int *ptr = (int *)&a;
 
    *ptr = 10;
 
    cout << "adress a     : " << &a << endl;
    cout << "adress in ptr: " << ptr << endl;
    cout << "data a       : " << a << endl;
    cout << "data ptr     : " << *ptr << endl;
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2013, 14:25
Ответы с готовыми решениями:

Когда переменная будет const?
Всем привет, вот меня заинтересовал вопрос, я объявил char test = &quot;t&quot;; и компилятор говорит, что...

Хочу разобраться с прототипами функций, const но переменная изменяется
Оригиналы хэш функций тут - назовем это ENG статьёй Я так подозреваю написано это на С, но вполне...

int const * const foo(const int* param) const - разъясните значение квалификаторов
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ?...

Строки: почему компилятор пишет , что переменная типа char несовместима с const char?
char pass; int password( int d) { int m; char p; cout &lt;&lt; &quot;Введите пароль для доступа к...

14
Каратель
Эксперт С++
6596 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
20.07.2013, 14:28 2
компилятор схитрил и подставил значение константы в место вывовода
0
3204 / 2015 / 346
Регистрация: 24.11.2012
Сообщений: 4,841
20.07.2013, 14:28 3
Компилятор офигел от такого, вот и...
Попробуйте так:
volatile const int a = 2;
0
Грамотный. Безпорно.
16860 / 9755 / 1880
Регистрация: 27.09.2012
Сообщений: 24,164
Записей в блоге: 2
20.07.2013, 14:29 4
Цитата Сообщение от bgm123 Посмотреть сообщение
Как так может быть?
Это UB
0
Каратель
Эксперт С++
6596 / 4017 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
20.07.2013, 14:29 5
delete
0
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 14:36  [ТС] 6
Цитата Сообщение от Croessmah Посмотреть сообщение
Это UB
Что такое UB. Я понимаю, что компилятору стало дурно. Но как по одному и тому же адресу могут содержаться разные значения?

Добавлено через 2 минуты
Цитата Сообщение от Jupiter Посмотреть сообщение
компилятор схитрил и подставил значение константы в место вывовода
А откуда он взял это значение?
0
3284 / 2668 / 721
Регистрация: 25.03.2012
Сообщений: 9,623
Записей в блоге: 1
20.07.2013, 14:39 7
Цитата Сообщение от bgm123 Посмотреть сообщение
const переменная
переменная - это то, что не const.
Название говорит само за себя.
0
Грамотный. Безпорно.
16860 / 9755 / 1880
Регистрация: 27.09.2012
Сообщений: 24,164
Записей в блоге: 2
20.07.2013, 14:40 8
Цитата Сообщение от bgm123 Посмотреть сообщение
Но как по одному и тому же адресу могут содержаться разные значения?
Константа, как переменная, вообще может быть удалена из кода.
Цитата Сообщение от bgm123 Посмотреть сообщение
Что такое UB.
Неопределенное поведение
Цитата Сообщение от bgm123 Посмотреть сообщение
А откуда он взял это значение?
В "Поле чудес" выиграл
1
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 14:44  [ТС] 9
Цитата Сообщение от Croessmah Посмотреть сообщение
Константа, как таковая, вообще может быть удалена из кода.
Вы бы один раз нормально объяснили и всё. А то на каждый вас ответ получаетс якуча вопросов. Почему она может быть удалена? Вы хотите сказать, что препроцессор перед компиляцией вместо индефикатора a подставляет соотв.значения?

Добавлено через 1 минуту
Иначе, как объяснить, что после перезаписывания битов по адресу a значения a не поменялось. Так не бывает!
0
Грамотный. Безпорно.
16860 / 9755 / 1880
Регистрация: 27.09.2012
Сообщений: 24,164
Записей в блоге: 2
20.07.2013, 14:45 10
Цитата Сообщение от bgm123 Посмотреть сообщение
Почему она может быть удалена?
Потому что в ней нет смысла.
Цитата Сообщение от bgm123 Посмотреть сообщение
Вы хотите сказать, что препроцессор перед компиляцией
Препроцессору вообще по барабану! Он работает на уровне текстовых файлов.
0
~ Эврика! ~
1253 / 1002 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
20.07.2013, 14:46 11
Цитата Сообщение от bgm123 Посмотреть сообщение
Вы хотите сказать, что препроцессор перед компиляцией вместо индефикатора a подставляет соотв.значения?
Именно. Только это делает компилятор. Потому что вы ему разрешили, сказав const. То, что вы там себе потом в ногу выстрелили, изменив какое-то значение в памяти, его мало волнует.
1
Грамотный. Безпорно.
16860 / 9755 / 1880
Регистрация: 27.09.2012
Сообщений: 24,164
Записей в блоге: 2
20.07.2013, 14:46 12
Цитата Сообщение от bgm123 Посмотреть сообщение
Так не бывает!
Я же написал - UB, а может даже и программа упасть!
А может даже и так, что компилятор сразу вычислил все значения и проставил их куда нужно, и указатель тоже выкинул, ибо че зря тратиться
0
42 / 42 / 27
Регистрация: 29.01.2013
Сообщений: 277
20.07.2013, 14:51  [ТС] 13
Ну тогда скажите, если конечно знаете, как по одному и тому же адресу памяти могут содержаться разные данные?

Добавлено через 1 минуту
Всё понял.

Добавлено через 1 минуту
Цитата Сообщение от OhMyGodSoLong Посмотреть сообщение
Именно. Только это делает компилятор. Потому что вы ему разрешили, сказав const. То, что вы там себе потом в ногу выстрелили, изменив какое-то значение в памяти, его мало волнует.
Но почему-тол если a сделать типа volatile const, то значение меняется? В этом случае компилятор уже не подставляет константу в текст программы?
0
Грамотный. Безпорно.
16860 / 9755 / 1880
Регистрация: 27.09.2012
Сообщений: 24,164
Записей в блоге: 2
20.07.2013, 14:53 14
Цитата Сообщение от bgm123 Посмотреть сообщение
Но почему-тол если a сделать типа volatile const, то значение меняется?
потому что volatile говорит компилятору "сие сущность может неявно поменяться, так что оставь её как есть, от греха подальше"
2
Комп_Оратор)
Эксперт по математике/физике
8466 / 4223 / 576
Регистрация: 04.12.2011
Сообщений: 12,608
Записей в блоге: 14
20.07.2013, 15:54 15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int foo(){
int a=3;
int b=4;
return a+b;
}
#include <iostream>
using namespace std;
int main()
{
const int a = foo();//давайте усложним инициализацию, 
//чтобы a не встраивалась в код а хранилась по адресу (моё предположение)
int *ptr = (int *)&a;
 *ptr = 10;
    cout << "adress a     : " << &a << endl;
    cout << "adress in ptr: " << ptr << endl;
    cout << "data a       : " << a << endl;
    cout << "data ptr     : " << *ptr << endl;
 
cout<<endl;
cin.get();
    return 0;
}


Добавлено через 39 минут
bgm123, поскольку тему просматривает и Biglow, задававший схожий вопрос:
Как обычную переменную на время сделать константой?
может будет интересно посмотреть вариант, как пользуясь доступом через указатель на константу менять значение по этому указателю при помощи этого же указателя без хулиганства:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int x = 10;
const int *a = new int(x);
cout<<"a= "<<*a<<endl; 
do{
cout<<"\nВведите целое число,"
"\nЕсли нечётное: ++a"
"\nЕсли чётное: a" 
"\nЕсли 0 - ВЫХОД\n"; 
cin>>x;
//будем увиличивать a только если x нечетное, например
if(x%2){//условие переключатель разрешающее изменение a
int tmp = *a;
delete a;
a = new int(++tmp);
}
//++*a; //это не скомпилируется, как и ожидалось
cout<<"a= "<<*a<<endl;
}while(x);
delete a;
cout<<endl;
cin.get();
return 0;
}
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2013, 15:54

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

В программе имеется следующий фрагмент: const char a='*'; char ch; как объявится указатель-переменная
В программе имеется следующий фрагмент: const char a='*'; char ch; как объявляется...

char operator[](unsigned short offset) const; // что означает const?
Собстенно вопрос уже озвучен :).

Что это bool operator== (const CLASS&) const;
Что это? class CLASS { public: bool operator== (const CLASS&amp;) const; ...

Const в параметрах. Перед чем нужно употребить const дабы обезопасить данные от изменения
const int Counter(const TSNum *Start) { int c=0; while(Start!=NULL){Start=Start-&gt;next;} ...

Модификатор const для параметра функции не const?
void foo(const int N) { int Arr; //&lt;-- ??? } В clang это работает. В VisualStudio 2015 нет.

Ошибка: Cannot convert 'char const[18]' to 'const wchar_t *'
Unit1.cpp(59): E2034 Cannot convert 'char const' to 'const wchar_t *' Full parser context ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.