Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При инициализации скалярных типов значение assignment-expression переменной назначается переменной. Применяются правила преобразования для назначения. (Сведения о правилах преобразования см. в разделе "Преобразования типов ".)
Синтаксис
declaration:
declaration-specifiers
init-declarator-list
выбирать;
declaration-specifiers:
storage-class-specifier
declaration-specifiers
выбирать
type-specifier
declaration-specifiers
выбирать
type-qualifier
declaration-specifiers
выбирать
init-declarator-list:
init-declarator
init-declarator-list
,
init-declarator
init-declarator:
declarator
declarator
=
initializer /* Для скалярной инициализации */
initializer:
assignment-expression
Вы можете инициализировать переменные любого типа, если соблюдать следующие правила:
Переменные, объявленные на уровне области файла, можно инициализировать. Если вы явно не инициализируете переменную на внешнем уровне, она инициализирована до 0 по умолчанию.
Константное выражение можно использовать для инициализации любой глобальной переменной, объявленной с помощью .
staticstorage-class-specifierПеременные, объявленные какstaticинициализированные при начале выполнения программы. Если вы явно не инициализируете глобальнуюstaticпеременную, она инициализирована до 0 по умолчанию, и каждый элемент с типом указателя назначается пустым указателем.Переменные, объявленные с
autoпомощью описателя класса хранилища,registerинициализированы каждый раз, когда элемент управления выполнением передается в блок, в котором они объявлены. Если опущен инициализатор из объявления илиautoпеременнойregister, начальное значение переменной не определено. Для автоматических и регистрирующих значений инициализатор не ограничивается константой; это может быть любое выражение, включающее ранее определенные значения, даже вызовы функций.Начальные значения для объявлений внешних переменных и для всех
staticпеременных, будь то внешние или внутренние, должны быть константными выражениями. Дополнительные сведения см. в разделе "Константные выражения". Так как адрес любой внешней объявленной или статической переменной является константой, ее можно использовать для инициализации внутренне объявленнойstaticпеременной указателя. Однако адрес переменнойautoнельзя использовать в качестве статического инициализатора, так как он может отличаться для каждого выполнения блока. Для инициализацииautoиregisterпеременных можно использовать константы или переменные.Если объявление идентификатора имеет область блокировки, а идентификатор имеет внешнюю компоновку, объявление не может иметь инициализацию.
Примеры
В следующих примерах иллюстрируются инициализации:
int x = 10;
Целочисленная переменная x инициализирована в константное выражение 10.
register int *px = 0;
Указатель px инициализируется до 0, создавая указатель null.
const int c = (3 * 1024);
В этом примере используется константное выражение (3 * 1024) для инициализации c в константное значение, которое невозможно изменить из-за ключевого const слова.
int *b = &x;
Эта инструкция инициализирует указатель b с адресом другой переменной. x
int *const a = &z;
Указатель a инициализируется адресом переменной с именем z. Тем не менее, так как она указана const, переменная a может быть инициализирована только инициализирована, никогда не изменяя. Он всегда указывает на то же расположение.
int GLOBAL ;
int function( void )
{
int LOCAL ;
static int *lp = &LOCAL; /* Illegal initialization */
static int *gp = &GLOBAL; /* Legal initialization */
register int *rp = &LOCAL; /* Legal initialization */
}
Глобальная переменная GLOBAL объявлена на внешнем уровне, поэтому она имеет глобальное время существования. Локальная переменная имеет LOCAL класс хранилища и имеет адрес только во время выполнения функцииauto, в которой она объявлена. Поэтому попытка инициализировать static переменную lp указателя с адресом LOCAL не разрешена. Переменная staticgp указателя может быть инициализирована в адрес, так как этот адрес GLOBAL всегда совпадает. Аналогичным образом можно инициализировать, *rp так как rp это локальная переменная и может иметь инициализатор неконстант. Каждый раз при вводе LOCAL блока имеет новый адрес, которому затем назначается rp.