У меня этот вопрос появился еще с тех пор, как я начинал изучать С++ и экспериментировал с указателями. В результате этих экспериментов пришел я однажды к таким нескольким строчкам кода: А вот результат работы этой программки: Внимание вопрос! Почему указатели на одну и ту же константную область памяти (один объявлен, как указатель на константу, а другой, как указатель на не константу; int *parPtr и const int *parPtr2) при разыменовании дают один результат (15), а сама область памяти содержит прежнее значение (5)??? P.S. То, что константы указывают на одну и ту же область памяти подтверждается последней строкой вывода.
l_inc Откуда ты знаешь, что область памяти содержит значение 5? Сгенерируй и посмотри на ассемблерный код, компилятор VC6 например в последнем вызове просто подставляет 5 вместо par2, т.к. par2 обьявлено константой.
Тогда какой смысл вообще в константах (если они не объявлены в качестве аргументов функции)? Какой смысл компилятору выделять под константу память, к которой он все равно не обращается, а имя константы заменяет, как простой макрос (практически тот же #define только с обгаживанием памяти)? P.S. Возможно эти вопросы звучат как риторические, поэтому конкретизирую просьбу: Действительно ли это так: компилятор выделяет для константы память, с которой никак не работает, а вместо имени константы подставляет просто ее значение (как препроцессор с макросами)??? Пожалуйста, знающие люди, подтвердите или опровергните!!! P.P.S. Если это действительно так, то я возмущен С++ до глубины души!!!
Если не ошибаюсь, то стандартом языка это не оговаривается. Это отдается на откуп разработчикам компиляторов. Но как правило, компиляторы по возможности не выделяют память под константы plane типов. Наличие этой возможности напрямую зависит от программиста. В твоем коде разыменование константной переменной вынуждает компилятор выделить память под нее. И еще в общем случае не гарантируется, что память под переменные со спецификатором хранения auto(по умолчанию), будет выделенна(и будет ли выделенна вообще) в стеке согластно порядку объявления переменых.
Спасибо. Понятно. Хотя не верится, что память под переменную, которая хотя бы раз использовалась в программе, может быть вообще не выделена (независимо от спецификатора хранения). По поводу порядка хранения переменных в памяти (что он должен соответствовать порядку их объявления) я ничего не говорил (если Вы имеете ввиду, что я получил указатель на соседнюю переменную с помощью parPtr--, то это было сделано простым подбором, а не основываясь на рассуждениях о том, как должен порядок расположения переменных в памяти зависеть от порядка их объявления). И все-таки странно, что значение константы подставляется вместо ее имени, как макрос. Логичнее было бы, если бы значение константы изменилось и результаты были бы такими: Особенно, если учесть, что получение адреса константы в указатель вынудило компилятор выделить память для этой константы.
Почему же странно. Компилятор поступил вполне логично. Имеем константу и указатель на константу, никакие const_cast не использовались, т.е. с точки зрения компилятора значения константы изменится не могло. А все извращения остаются на совести программиста=)