Использование & (addressof) с константными переменными в C - PullRequest
2 голосов
/ 29 ноября 2009

В учебниках говорится, что оператор & (addressof) не применяется, не может применяться к выражениям,
константы или регистр переменных.
Означают ли константы только литералы типа «A», «7» и т. Д. Или переменные, объявленные также с ключевым словом const? Я думаю, что это означает только литералы, так как следующий код компилируется: -

int main()
{
const int i=10;
const int *ip;

ip = &i;

}

Ответы [ 3 ]

3 голосов
/ 29 ноября 2009

Нет - его можно применить к переменной, которая квалифицируется как const. Обратите внимание, однако, что это (как правило) означает, что компилятор должен фактически присвоить этой переменной адрес - если вы используете ее только таким образом, что вам не нужен адрес, переменная const часто не нуждается в назначить какое-либо хранилище вообще (т. е. код, сгенерированный с использованием переменной const, часто будет почти таким же, как если бы вы непосредственно использовали литерал, но вместо этого ваш исходный код будет использовать значимое имя).

3 голосов
/ 29 ноября 2009

Унарный оператор & в C может применяться к любому lvalue. Объект с квалификацией const - это lvalue, что означает, что к нему можно применить унарный &.

Термин «константа» в C действительно означает только буквальные константы, как, например, 2. Объект с квалификацией const не является «константой» в терминологии C.

0 голосов
/ 29 ноября 2009

&operator может применяться ко всему, что имеет адрес памяти. Вы не можете применить & к переменным регистра, так как они хранятся в регистрах ЦП.
Также в C константы не являются константами времени компиляции (т. Е. Всегда выделяется память), поэтому вы можете смело принимать адрес постоянной переменной. Но в C++, если вы берете адрес переменной const, она не будет постоянная времени компиляции и будет выделено хранилище.
Редактировать
Под константами я подразумеваю, что переменные, объявленные с ключевыми словами const, литералами, такими как A, 7, по существу, компилируются во время компиляции. Constants.compiler может напрямую сохранять их в своей таблице символов.

...