C언어 요점 정리 - 지역변수

2022. 1. 7. 19:39C언어

함수는 마스터를 했고, C언어 기초의 마지막 포인터를 배울텐데 포인터를 위해서는 사전 지식이 필요합니다. 그중에서 지역변수라는 개념을 배워볼텐데 저번에 한번 변수 생성할때 주의사항 같은걸 말씀드린적이있었는데 그중 하나가 변수 이름을 같은걸 쓰면 뭐가 뭔지 몰라서 못 찾는다고 했어요. 근데 반복문배울때 for문 안에서 int i를 썻지만 while문을 위해 다시 초기값 int i를 만들었던거 기억하실까요?? 이것처럼 자기 구역 안에서만 활동을 하다가 사용되지 않는걸 지역변수라고 합니다.

지역변수는 자신보다 안에 있는 괄호 안에 있는 변수에는 접근이 불가능해요. 어떤 말이냐면 자기가 속한 괄호를 살피고 그 괄호 밖에 가장 인접한 값을 가져온다는 말입니다. 첫번째 a를 봤을때 같이 속해있는 a가 없어요 그럼 안에있는걸 접근 못하니깐 가장 근처에 있는 밖에 있는 변수인 30를 가져옵니다.

int main(){
        int a = 30;
        {
          {
            int a = 40;
            {
              int a = 50;
            }
          }
          printf("%d\n", a); // 30
        }
        return 0;
      }

아래 예시코드를 봐주세요. 무조건 main함수가 먼저 실행이 된다고 말씀 드렸습니다. if(0)이면 거짓이기 때문에 호출되지 않습니다. test1에서 a를 만들었지만 그 a는 test1에서만 사용되는 a입니다. main에 있는 a와 상관이 없어요. 두번째 if문에 있는 a를 봅시다. 참이니깐 실행되야 하는데 같은구역에 선언된 a가 없죠? 그럼 제일 근처에 있는 110 a를 30으로 바꾸게 됩니다. 매개변수도 함수의 지역변수로 들어가서 밖에있는 a를 건드는게 아니라 그냥 그 함수에서만 사용되는 a입니다. 180을 매개변수 받아왔다가 그값을 200으로 바꾼것 뿐이에요. 영향 없습니다. if 1이니깐 참이라 실행이 되는데 이번에는 a가 안에서 선언되고 초기화된게 보이실까요. 그럼 얘는 그냥 요 if문 안에서만 사용되는 a입니다. test3에서도 a = 70으로 바꿨는데 여기는 같은지역에 변수 있나요? 없죠 매개변수있나요? 그것도 없죠. 그러니깐 가장근처에 있는 밖에 있는 변수의 값을 변경 시켜준겁니다.

#include <stdio.h>

int a = 220;

void test1() {
  int a = 120;
}


void test2(int a) {
  a = 200;
}


void test3() {
  a = 70;
}

int main(void) {

  int a = 110;

  if(0){ 
    a = 20;  
  }

  test1();

  if(1){
    a = 30;
  }

  test2(180);

  if(1){
    int a = 150;
  }

  test3();

  printf("%d", a);
  //a의 값은 무엇일까요??  30
  return 0;
}
728x90