Olá,
Agora entendi, bom quanto a sua dúvida.
Tudo que é instanciado dentro de um escopo { }, pode ser um for, um if ou while,
quando o escopo termina o que foi criado é liberado.
No seu exemplo, as variáveis C** e **I só exitem dentro do escopo do for.
E o C é criado e liberado a cada interação.
Se uma variável não é utilizada fora do escopo é sempre melhor declara-la dentro do escopo, para que o compildor se encarregue de alocar e liberar a memoria.
Isso não vale para a memoria que você aloca manualmente, nesse caso é vc quem tem que alocar e desalocar, mesmo dentro de um escopo, se não vc cria um caso de vazamente de memoria.
Quanto ao fato de no seu exemplo ele pegar sempre o mesmo endereço de memoria ai o lance é mais sobre como o compilador gerou o assembly do teu código.
O compilador é inteligente para fazer otimizações e ele vai fazer o teu executável otimizar essa questão pegando sempre o mesmo endereço de memória, porque o programa é pequeno e simples.
Mas o fato de ele pegar sempre o mesmo endereço é por conta do Copilador que vc está usando, o quanto ele está setado para otimizar e do que o teu código está fazendo.
Você pode fazer o disassembly do executável de compiladores diferentes e ver o que eles fazem de diferente com o mesmo código.
Resuindo todo esse bla-bla-bla, é SIM, ele pega o mesmo endereço de memoria para ESTE caso, mas isso NÃO É UMA REGRA.