함수라는 것은 보통 자신만의 영역을 가지고 있다.
이게 무슨말이냐 하면
함수속에 정의한 변수는 그 함수 영역에서만 사용가능하다는 것이다.
보통 그 영역을 나누는 것은 중괄호{ }를 통해 이루어 지게 된다.
예를 들어
#include<stdio.h>
int main(){
int n=3;
printf("%d ", n);
{
int n =5;
printf("%d ",n);
}
printf("%d", n);
}
이렇게 실행하면 결과는 3 5 3이 출력된다.
왜 그런가 하면 순차적으로 실행했을 경우 첫번째 출력에서는 당연히 먼저 실행되는 것이 n=3이기 때문에
3을 출력한다.
두번째 출력에서 보면 int n = 5; 가 중괄호{ } 속에 정의되어 있기 때문에
포함되 영역으로 보면 int n=3; 보다 int n =5를 먼저 확인하게 된다. 그래서 5가 출력된다.
만약에 int n =5 가 없다면 자신의 영역을 벗어나 더 큰 영역에서 n이 있는지 찾게 된다.
세번째 출력에서 보면 자신이 포함된 영역은 int n=3;이 보이는 영역이다. 따라서 3이 출력된다.
그림으로 보면 다음과 같다.
결국 변수라는 것은 영역속에서만 참고할 수 있게 된다.
이때 특정영역에 속하지 않는 변수를 만들 수 있게 되는데 이러한 변수를 전역변수(global variable)라고 하고
영역에 속해 있는 변수는 지역변수(local variable)라 한다.
전역변수의 예는 다음과 같다.(전역변수는 초기화 하지 않아도 자동으로 0으로 값이 설정된다.)
#include<stdio.h>
int n;
void fun(){
printf("%d ",n);
n = 5;
}
int main(){
n =3;
fun();
printf("%d ", n);
return 0;
}
출력결과는 : 3 5
이럴경우 실행결과는 int n 변수는 전역변수이기 때문에 어느 함수에서도 참조할 수 있게 된다.
따라서 main()에서 n=3을 실행하면 n이 main()함수에 없기 때문에 더 큰 영역에서 찾아 값을 할당한다.
그리고 fun()함수를 호출하게 되고 fun()함수에서 n을 출력하니 n이 fun()함수에 없기 때문에
더 큰 영역에 있는 n의 값을 출력하고 n을 5로 변경하고 fun()함수는 종료되고 다시 main()함수로 와서
n을 출력하면 fun()함수에서 변경 했기 때문에 출력은 5가 된다.
그림으로 보면 다음과 같다.
다음 내용은 중요하니 잘 보기 바랍니다.
이러한 변수의 영역으로 인해
함수를 호출할 때 넘겨주는 (실)매개변수는 호출하는 쪽 영역의 변수이기 때문에
함수의 정의부분에 있는 (형식)매개변수와 이름이 같더라도 두 변수는 전혀 다른 변수이다.
대신 호출하는 쪽에서 변수에 들어 값을 복사하여 값을 넘겨주는 개념으로 생각하면 된다.
예를 들어
void sum(int a){
printf("%d",a);
a= 5;
}
int main(){
int a =3;
sum(a);
printf("%d",a);
}
a가 같다고 해서 sum()함수에서 a를 변경해도 main()의 a는 변경되지 않는다.
자 그러면 지금부터 전역변수를 이용하여 주어진 문제를 푸는 함수를 만들어 봅시다.
상황은 다음과 같다.
1. 전역변수 int n; 로 정의되어 있습니다.
2. main() 함수에서 전역변수 n에 값을 입력받습니다.
3. 그리고 사용자가 만든 함수를 호출합니다. (반환값, 매개변수 없음, 함수이름 globalfun )
4. 호출된 함수는 전역변수를 이용하여 입력된 n을 n번 출력한다.