자료실/C언어

C언어 - 지역변수, 전역변수

자료수집중 2020. 6. 22.
반응형

 

변수는 선언되는 위치에 따라서 성질이 변합니다.

대표적으로 지역 변수(lacal variable)전역 변수(global variable)가 있습니다.

 

지역 변수는 이름 그대로 지역에서만 사용하는 변수입니다. 

블록({}) 안에서 선언되면 선언된 블록 안에서만 사용이 가능합니다.

전역 변수는 지역 변수와 다르게 전역에서 사용이 가능합니다.

 

 

 

 

3개의 변수의 합을 더하는 코드를 작성했습니다.

int num1 = 1;
int num3 = 3;
void sum_1(int a);

int main(void)
{
    int num2 = 2;
    sum_1(num2);
    return 0;
}

void sum_1(int a) {
    printf("%d + %d + %d = %d \n", num1, a, num3, num1 + a + num3);
}

sum_1에서 3개의 변수를 합한 후 출력해서 결과 값을 보여줍니다.

여기서 num1num3는 전역 변수지만 num2main()에 선언된 지역변수입니다.

void sum_1(int a) {
    printf("%d + %d + %d = %d \n", num1, a, num3, num1 + a + num3);
}

에서 3개의 수를 출력할 때 sum_1의 매개변수 a를 이용해 출력합니다 main()의 지역변수인 num2를 직접 넣게 되면 '선언되지 않은 식별자입니다'라는 에러가 발생합니다.

sum_1() 함수에서 main()에 선언된 지역변수를 사용하기 위해 인자값으로 받아서 사용한 겁니다.

 

 

지역변수는 블록 또는 함수만 다르다면 같은 이름을 사용이 가능합니다.

같은 이름의 변수는 잘 사용하지 않지만 가능합니다.

void sum_1();

int main()
{
    int num = 100;
    for (int i = 0; i < 10; i++) {
        int num = i;
        printf("for() 의 num = %d \n", num);
    }
    printf("\n\n");
    printf("main() 의 num = %d \n\n", num);
    sum_1();
    return 0;
}

void sum_1() {
    int  num = 1000;
    printf("sum_1의 num1 =%d \n", num);
}

main(){}, for(){}, sum_1(){} 모두 같은 이름 num을 사용해도 에러가 나지 않고 사용할 수 있습니다.

대신 중요한 점은 같은 이름이라도 현재 코드가 작성되는 블록 안에 변수가 우선입니다.

main문 안에 for문에서 num을 선언하고 계속 값을 바꿔도 main에서 선언된 num에는 영향을 주지 않습니다.

자료형이 달라도 가능합니다.

일반적으로 지역 변수는 선언된 블록이 끝나면 소멸됩니다.

 

 

그럼 만약 전역 변수와 지역 변수가 같은 이름이라면 

int num1 =0;
int num2 =100;

int main()
{
	printf("%d %d\n\n", num1,num2);
	int num2 = 0;
	printf("%d %d\n\n", num1, num2);
	return 0;
}

num1num2를 한번 출력 후 지역 변수 num2를 선언한 후 다시 출력했습니다. 결과는

num2의 출력이 변한 결과를 볼 수 있습니다.

전역 변수와 지역 변수가 이름이 같다면 지역 변수가 우선이 됩니다.

자료형이 달라도 이름이 같다면 지역변수가 우선이 됩니다.

 

 

마지막으로 지역 변수와 전역 변수의 초기화입니다.

보통 변수를 선언하면 int num = 0;처럼 선언 후 초기화를 해줍니다.

지역 변수와 전역 변수는 초기화를 보면 차이가 있습니다.

지역 변수와 전역 변수를 선언하고 초기화를 하지 않은 상태에서 출력을 보면

int num1 ;
int main(void) {
	int num2 ;
	printf("전역 변수 = %d \n", num1);
	printf("지역 변수 = %d \n", num2);
	return 0;
}

전역 변수는 초기화하지 않으면 자동으로 0으로 초기화됩니다.

하지만 지역 변수는 초기화하지 않으면 쓰레기 값(garbage value)이 출력되게 됩니다.

그래서 지역 변수는 초기화를 꼭 해야 합니다.

 

'자료실 > C언어' 카테고리의 다른 글

C언어 - 배열  (0) 2020.06.23
C언어 - 변수의 생존기간과 저장 유형 지정자  (0) 2020.06.22
C언어 - 함수(function)  (0) 2020.06.18
C언어 - break, continue, return  (0) 2020.06.17
C언어 - 반복문 for(), while()  (0) 2020.06.16

댓글