C언어에서 변수는 지역변수와 전역변수로 나눌 수 있습니다.
그 차이점에 대해서 알아보도록 하겠습니다.
지역변수
지역변수는 함수 내에서 선언되거나, 중괄호(블럭) 내에서 선언되거나, 형신 인자로서 선언되는 변수를 뜻합니다.
함수 내에서 선언되는 지역변수의 경우, 지역변수가 선언된 함수 내에서만 접근이 가능하며 함수가 호출될 때마다 새롭게 할당됩니다.
또함 호출된 함수가 리턴되면 지역변수는 소멸합니다.
중괄호(블럭)내에서 선언되는 지역변수의 경우 중괄호에 진입할 때 할당되고 빠져나가면 소멸합니다.
형식 인자도 지역변수와 비슷하게 선언된 함수 내에서만 접근이 가능하며, 함수가 리턴되면 저장된 값이 사라집니다.
또한 for()문의 괄호 속 지정문에서 선언되는 변수 또한, for문 속에서만 유효합니다.
하나의 지역(블럭) 내에서 동일한 이름의 지역변수는 선언이 불가능합니다.
그러나 다음처럼 블럭이 구분된다면, 동일한 이름의 변수를 선언할 수 있습니다.
# include <stdio.h>
int main(){
int a;
for( a = 10; a < 20; a++){
int a = 20;
printf("%d\n", a);
}
}
결과는 다음과 같습니다.
이들을 종합하면 다음과 같은 코드도 정상적으로 작동함을 알 수 있습니다.
# include <stdio.h>
int main(){
int a;//(1)
for(int a = 10; a < 13; a++){//(2)
printf("%d\n", a);//(2)
int a = 20;//(3)
printf("%d\n", a);//(3)
}
return a;//(1)
}
결과는 다음과 같습니다.
전역변수
전역변수는 지역변수와 달리 함수 외부에서 선언됩니다.
프로그램의 시작과 동시에 메모리 공간에 할당되며, 이때 별도의 초깃값이 없는 경우 0으로 초기화됩니다.
전역 변수는 프로그램 전체 영역 어디에서든 접근이 가능하며, 지역변수와 전역변수의 이름이 같은 경우에는 지역변수를 우선으로 합니다.
예를 들면 다음과 같습니다.
# include <stdio.h>
int a;
int main(){
printf("초기화 전 전역변수 a값 : %d\n" , a);
a= 10;
printf("a=10 후 전역변수 a값 : %d\n" , a);
int a = 200;
printf("지역변수 a값 : %d\n" , a);
for(int a = 10; a < 13; printf("for문의 조건문 속 a값 : %d\n" , a), a++){
printf("for문의 조건문 속 a값 2 :%d\n", a);
int a = 20;
printf("for문 내에서 다시 정의된 a의 값 : %d\n", a);
}
return a;
}
해당 코드의 결과는 다음과 같습니다.
static 변수
(자바의 static과 다릅니다)
static 변수는 맨 처음 사용될 때(최초 호출 시)만 초기화되고, 그 이후 프로그램 종료시까지 메모리 공간에 남아있게 됩니다.(전역변수는 프로그램 시작 시 바로 초기화되고 존재하지만, static 변수는 최초 호출시부터 존재합니다.)
이는 전역변수와 비슷하지만, 특이한 점이 있습니다.
static 변수는 선언된 함수(지역) 안에서만 접근 가능합니다. 즉 지역변수와 동일합니다.
또한 static 변수는 따로 초기화하지 않으면 0으로 초기화됩니다.
정리하자면static 변수의 scope는 지역변수와 동일하나, lifetime은 전역변수와 비슷합니다.
# include <stdio.h>
int newId();
int main(){
printf("%d\n", newId());
printf("%d\n", newId());
printf("%d\n", newId());
return 0;
}
int newId(){
static int i ;
return i++;
}
결과는 다음과 같습니다.
지역 참조 환경(local referencing enviroment)
특정한 지역(블럭)에서의 사용 가능한 변수들을 모아놓은 것입니다.
'c언어' 카테고리의 다른 글
[C언어] - register, volatile 키워드 (0) | 2022.04.19 |
---|---|
[C언어] - 스택프레임 (0) | 2022.04.19 |
[C언어] - 함수 (0) | 2022.04.19 |
[C언어] - 조건문, 반복문 (0) | 2022.04.19 |
[C언어] - 연산자, 형변환 (0) | 2022.04.19 |