Эта переменная всегда будет по одному и тому же адресу памяти. Почему?
Объект , который обозначает number
, имеет auto
продолжительность хранения и существует только в течение времени жизни тела l oop, поэтому логически говоря, новый экземпляр создается и уничтожается на каждой l oop итерации.
Практически говоря, проще просто повторно использовать одну и ту же ячейку памяти для каждого l oop итерация, что и делают большинство (если не все) C компиляторов. Просто не гарантируется сохранение своего последнего значения от одной итерации к следующей (особенно если вы инициализируете ее на каждой итерации).
И какая реальная разница между объявлением его внутри или снаружи l oop тогда?
время жизни объекта (период выполнения программы, для которой гарантированно будет зарезервирована память) изменяется с тела l oop на тело функции. область идентификатора (область текста программы, в которой виден идентификатор) изменяется с тела l oop на тело всей функции.
Опять же, практически говоря, большинство компиляторов выделяют пространство стека для auto
объектов, которые находятся в блоках при входе в функцию - например, с учетом кода
void foo( void )
{
int bar;
while ( bar = 0; bar < 10; bar++ )
{
int bletch = 2 * bar;
...
}
}
большинство компиляторов будут генерировать инструкции для резервирования пространства стека для bar
и bletch
при вводе функции, вместо того, чтобы ждать записи l oop, чтобы зарезервировать место для bletch
. Просто проще установить указатель стека один раз и покончить с этим. Хранилище гарантированно должно быть зарезервировано для bletch
в течение срока жизни тела l oop, но в определении языка нет ничего, что говорило бы, что вы не можете зарезервировать его до этого.
Однако, если у вас есть такая ситуация:
void foo( void )
{
int bar;
while ( bar = 0; bar < 10; bar++ )
{
if ( bar % 2 == 0 ) // bar is even
{
int bletch = 2 * bar;
...
}
else
{
int blurga = 3 * bar + 1;
...
}
}
bletch
и blurga
не могут существовать одновременно, поэтому компилятор может только выделить место для одного дополнительного объекта int
, и это же пространство будет использоваться для bletch
или blurga
в зависимости от значения bar
.