본문 바로가기
OLD/[C]정리중

[개탱][C][지역변수와 전역변수]

by 개탱 2018. 1. 2.
728x90

지역변수 & 전역변수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int a; // 전역변수
 
int main()
{
    int a = 100// 지역변수
    aa();
    bb();
    printf("Main 함수 내의 a 는 %d 입니다\n",a);
}
 
void aa()
{
    int a = 10//지역변수
    a++;
    printf("aa 함수 내의 a 는 %d 입니다\n",a);
}
 
void bb()
{
        printf("bb 함수 내의 a 는 %d 입니다\n",a);    
}
 
cs


함수내부에서 어떠한 변수에 대한 연산이 진행될 때

전역변수와 지역변수가 둘다 정의가 되어있다면 자신과 가장 가까이에 있는 

지역변수를 이용하여 연산을 진행하며

전역변수만 존재하고 지역변수가 존재하지 않는다면 전역변수의 값을 가지고 연산을 진행한다.



저는 평소 지역변수와 전역변수간에 변수 사용시 

항상 

자신 또는 자신의 가장 근처 또는

자신 또는 자신을 감싸고 있는 것들의 가장 가까운 곳  또는

조금더 들어가서 코드를 그림처럼 그렸을 때 자신을 감싸고 있는 것들중 가장 가까운 곳...


이라고 생각합니다. 약간 어렵다면


코드의 예시를 들어

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
 
int a = 10;
int main() {
    int a = 20;
    int i;
    int j;
    
    for(i = 0; i < 1; i++)
    {
        for(j = 0; j < 1; j++)
        {
            int a = 30;
            printf("%d\n", a);
        }
    }
}
cs


 라고 했을 때 위 코드는 간단한 2중 for문으로  a를 출력하는 코드입니다.
먼저 위에서 말한 코드를 그림처럼 그린다면 미숙한 그림판이지만..


아마 저는 이런식으로 그릴 것 같습니다.


현재 14번 라인의 printf("%d\n", a); 를 실행하고 있다고 가정할 때, 
우리는 a라는 변수가 필요합니다.


내가 실행 중인 코드 위치에서 printf("%d\n", a); 를 만났을 때

자신을 감싸고있는 안쪽 for문의 내부 에서 a가 있는지 없는지를 판단합니다.

위 코드상에서는 현재 int a = 30; 이라는 코드가 선언이 되어있으며
그림림상에서도 안쪽 for문 내부에 a라는 변수가 선언되어 있습니다.

이제 우리는  printf("%d\n", a); 를 실행시 30이라는 출력값을 얻게 됩니다.

자 이때 내부 for문 안에서 int a = 30; 이글이 없어진다면 어떻게 될까요?




위 그림과 같이된다면.. 우리는 실행중인 

printf("%d\n", a);

  를 감싸고있는 안쪽 for문을 확인하게됩니다.

하지만 우리는 a를 발견할수 없으므로 그 밖에있는 for문을 확인하게 되며


또한 이때 역시도 a가 존재하지 않으므로 main을 확인하게 됩니다.


이때 main 에는 int a = 20; 이라는 선언이 되어있으므로


우리는 이 a를 사용하여 

printf("%d\n", a);

 를 실행시 20이라는 출력값을 얻게됩니다..


만약 여기서도 a가 사라진다면 어떻게 될까요?



또 a가 사라져 우리는 이제
안쪽 과 바깥쪽 for와 main에서도 확인을 할 수 없게 되었습니다.

이때 우리가 확인할곳은 그림상 우측에있는 전역변수가 저장되는 메모리 공간입니다.

이렇게 main에서 조차 확인이 안될경우에 전역변수를 확인하여 

우리는 이 a를 사용하여 

printf("%d\n", a);

 를 실행시 10이라는 출력값을 얻게 됩니다.


만약 여기서도 a가 사라진다?..


그 어디에서도 a를 발견할 수 없으므로 에러가 나게됩니다!

[단 위처럼 그림을 그릴 때 주의할점]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int a; // 전역변수
 
int main()
{
    int a = 100// 지역변수
    aa();
    bb();
    printf("Main 함수 내의 a 는 %d 입니다\n",a);
}
 
void aa()
{
    int a = 10//지역변수
    a++;
    printf("aa 함수 내의 a 는 %d 입니다\n",a);
}
 
void bb()
{
        printf("bb 함수 내의 a 는 %d 입니다\n",a);    
}
 
cs





사용자 정의함수 
위 코드의 void aa() or void bb() 와 같은 경우에는 main 지금까지 보여드린 위 그림처럼 main 내부에 그리는 것이아닌
비록 main 내부에서 호출은 하였지만


위와 같이 따로따로 그려주어야 하며 main에 있는 a와 관계없이 

aa내부의 a를 확인하며

bb같은 경우에는 a를 출력해야하지만 내부에 a가 없으므로 

main을 확인하는 것이 아닌 전역변수 저장구역에 있는 a를 확인하여 들고와야합니다!!




설명이 많이 부족한것 같지만..ㅠ 혹시나 도움이 되길바라며 이렇게 끄적여봅니다.


혹시 틀렸다면.. 피드백 부탁드립니다!




 

 

댓글