Доступ к внешней локальной переменной из внутреннего блока, имеющего другую переменную с тем же именем

#include <stdio.h>
#include <conio.h>

void main()
{
    int i = 1;
    {
        int i = 2;
        printf("%d", i);
    }
    scanf("%d", &i);
 }

У меня есть две локальные переменные с тем же именем. Оба имеют разные значения. Вышеуказанная программа печатает 2,

Как я могу получить доступ i со значением с одним?

4 ответа

Просто сделайте небольшое изменение в своем коде, используйте целочисленный указатель. Как показано ниже:

#include <stdio.h>
#include <conio.h>

 void main()
{
   int i = 1;
   int *p = &i;  //Address of i given to p(integer pointer)
     {
      int i = 2;
      printf("%d", i);
      printf("---->Desire value in inner loop i= %d<-----\n",*p);
     }
  printf("---->Desire value outside of loop  i= %d and *p= %d<-----\n",i,*p);
  scanf("%d", &i);
}

В приведенном выше коде целочисленный указатель p имея адрес i. Так что всякий раз, когда вы хотите получить доступ внутри inner цикл также вы можете получить значение i используя целочисленный указатель. Это просто!

С следует lexical scope, Это означает, что разрешение имени переменной выполняется в зависимости от расположения variable в исходном коде. Переменная разрешается путем поиска в содержащем его блоке, если это не удается, тогда выполняется поиск во внешнем содержащем блоке.

{
   int i=2;           
   printf("%d",i);    //this i is the one you defined just above, inside {}
}

Это следующий i обновит i ты объявил в main()

scanf("%d",&i);

который этот,

void main()
{
    int i=1;
    ...

Итак, внутри внутреннего блока {}Вы не можете получить доступ к внешнему i, поскольку они имеют одинаковое имя, а во время разрешения имени, внутренний i будет найден (так как сначала будет искать внутренний блок i).

Одним из способов является использование указателей, как указано в этом ответе ниже.

Это все о лексической сфере здесь -

int i = 1;
{                  // inside this you can't access the outer i as they have same name so it will be shadowed by inner one 
    int i = 2;
    printf("%d", i);  // this will print the value of inner i
}

Точно так же вы не можете получить доступ к внутреннему i вне этих { },

Если вы хотите напечатать внешний i Вы можете просто положить printf после того, как вышеупомянутый блок заканчивается, или вы можете использовать указатель, как это -

  int i=1;
  int *p;             
  p=&i;              

и распечатай это.

Вам следует ознакомиться с понятиями:

Локальные переменные, область и продолжительность

Переменные, которые объявлены внутри функции или блока, являются локальными переменными. Они могут использоваться только операторами, которые находятся внутри этой функции или блока кода. Локальные переменные не известны функциям вне их собственных.

Другие вопросы по тегам