지역변수는 블록 내부에서 사용하는 변수이다.
- 사용범위는 블록 내부로 한정된다.
- 함수 형태
- auto 자료형 변수명; // 'auto'는 생략 가능하다.
예시1
#include <stdio.h>
void assign(void);
int main(void) {
auto int a = 0;
assign();
printf("\nmain함수 a:%d\n", a);
return 0;
}
void assign() {
int a;
a = 10;
printf("assign 함수a:%d", a);
}
실행결과
assign 함수a:10
main함수 a:0
정수형 지역변수 a를 선언 및 초기화 한다. assign()를 호출한다. 호출된 함수 정의를 보면, main()내에 있는 같은 이름의 지역변수를 선언하였다. 서로 다른 블록 내에 있기 때문에 헷갈릴 수 있지만 같은 이름을 다른 함수에서 사용할 수 있다. a에 10를 대입하고 함수를 출력한다. 그리고 다시 main()으로 돌아와서 printf()를 호출하면, 어떠한 값이 나오는지 확인한다.
같은 이름일지라도 다른 서로 다른 변수이기 때문에 '0' 값이 출력된다.
예시2
#include<stdio.h>
int main(void) {
int a = 10, b = 20;
printf("교환 전 a와 b의 값: %d, %d\n", a, b);
{
int temp, a,b;
a = 11;
b = 12;
temp = a;
a = b;
b = temp;
}
printf("교환 후 a와 b의 값: %d, %d\n", a, b);
return 0;
}
실행결과 교환 전 a와 b의 값: 10, 20 교환 후 a와 b의 값: 10, 20
main()내에 정수형 지역변수 a와 b를 선언 및 초기화한다. 먼저 a,b값을 콘송창에 출력해서 값을 확인한다. 그다음에 중괄호를 사용하고 중괄호 내부에 이름이 같은 a,b변수와 임시로 사용할 temp변수를 선언한다. 마치 자료구조 기초에서 배우는 swap()처럼 a와 b의 값을 temp를 이용하여 바꾼다. 그리고 중괄호 바깥에 printf()함수를 호출하여 어떠한 값이 나오는지 확인한다.
전역변수는 함수밖에시 선언하는 변수이다.
- 사용범위는 프로그램 전체 그리고 종료시까지이다.
- 전역변수를 선언한 뒤 따로 초기화 하지 않으면 0으로 초기화 된다.
예시
#include <stdio.h>
void assign10(void);
void assign20(void);
int a;
int main(void) {
printf("함수 호출 전 a값:%d\n", a);
assign10();
printf("함수 호출 후 a값1: %d\n", a);
assign20();
printf("함수 호출 후 a값2: %d\n", a);
return 0;
}
void assign10(void) {
a = 10;
}
void assign20(void) {
int a;
a = 20;
}
실행결과
함수 호출 전 a값:0
함수 호출 후 a값1: 10
함수 호출 후 a값2: 10
main()바깥에 전역변수 a를 선언한다. 선언한 a값을 확인하기 위해서 printf()를 호출하여 값을 확인한다. assign10()함수를 호출한다. 그리고 다시 main()에서 printf()를 호출하여 a값을 확인한다. 여기까지 쉽게 값을 알 수 있다. 그 다음에 assign2()함수를 호출한다. assign20()정의를 보면, 정수형 지역변수를 선언하고 a에 20을 대입한다. 그리고 다시 main()내에서 printf()함수를 호출하여 어떠한 값이 나오는지 확인한다.
마지막 실행결과를 보면, a의 값이 바뀌지 않은 이유는 전역변수와 지역변수의 이름이 같으면 지역 변수를 먼저 사용하기 때문이다.
정적지역변수는 함수가 반환되더라도 정적지역변수가 할당된 메모리 공간을 유지하는 변수이다.
- 지역변수이기에 사용범위는 블록 내부로 제한된다.
- 할당된 메모리 공간은 프로그램이 실행되는 동안 유지된다.
- 초기화하지 않으면 0으로 자동 초기화된다.
예시
#include <stdio.h>
void auto_func(void);
void static_func(void);
int main(void) {
int i;
printf("일반 지역 변수(auto)를 사용한 함수...\n");
for (i = 0; i < 3; i++) {
auto_func();
}
for (i = 0; i < 3; i++) {
static_func();
}
return 0;
}
void auto_func() {
auto int a = 0;
a++;
printf("%d\n", a);
}
void static_func() {
static int a;
a++;
printf("%d\n", a);
}
실행결과
일반 지역 변수(auto)를 사용한 함수...
1
1
1
1
2
3
main()안에서 for문을 이용하여 auto_func()를 총 3번 반복호출한다. auto_func()정의를 보면, 정수형 지역변수 a를 선언 및 초기화한다. 그리고 값을 1씩 증가시킨다. 이후 printf()를 호출하여 값을 확인한다. auto_func()가 호출될 때마다, 지역변수 a를 새롭게 선언 및 초기화하기 때문에 똑같은 값이 출력되는 것을 확인할 수 있다. 이후 똑같이 static_func()정의를 보면, 정적 지역변수 a를 선언하고 값을 1씩 증가시키고 printf()를 호출하여 값을 확인하면, 값이 증가된 것을 확인할 수 있다.
static_func()가 반환되더라도 정적 지역변수a가 할당된 메모리 공간은 반환되지 않고 남아있기 때문에 값이 증가하였다.
레지스터 변수는 메모리 대신에 CPU안에 레지스터를 저장공간을 사용하는 변수이다.
- 레지스터 사용여부는 컴파일러가 결정한다.
- CPU안에 있는 레지스터에 할당되기 때문에 데이터 처리 속도가 빠르다.
- 사용횟수가 많은 경우에 주로 사용하여 실행 시간을 줄일 수 있다.
- 변수 형태
register 자료형 변수명;
예시
#include <stdio.h>
int main(void) {
register int i;
auto int sum = 0;
for (i = 0; i <= 10000; i++) {
sum += i;
}
printf("%d\n", sum);
return 0;
}
실행결과
50005000
레지스터 정수형 변수 i를 선언한다. 값을 저장할 변수 sum을 선언 및 초기화한다. 반복문을 사용하여서 1부터 10000까지 차례대로 값을 증가시키면서 sum에 대입한다. 마지막으로 printf()를 호출하여 값을 확인한다.
변수 i의 경우 조건식에서 한 번, 중괄호 내부에서 한 번, 증감식 한 번 그래서 sum보다 약 3배이상 반복사용하기 때문에 레지스터 변수로 선언하였다.