STATIC변수란
단 한번만 초기화 되고, 그 이후에는 전역변수처럼 프로그램이 종료될 때까지 메모리 공간에 존재하는 변수.
초기값이 지정이 안되면, 자동으로 0이 대입된다.
int a; 로 선언하면 a에 임의로 이상한 값이 들어가있는데,
static int a로 선언하면, 0이 자동으로 대입된다.
지역변수와 STATIC변수의 활용을 비교해보자
지역변수의 사용
void tes() {
int a = 10;
a++;
printf("%d" a);
}
void main() {
test();
test();
}
a |
10 |
11 |
한번 사용한 지역변수는 초기화 돼서
두 번째 test를 호출할 때에 a에 역시 10이 들어있어서
결과값으로
11, 11이 출력되게 된다.
static 변수 사용
void test() {
static int a = 10;
a++;
printf("%d", a);
}
void main() {
test();
test();
}
a |
10 |
11 |
정적변수이기 때문에 함수가 종료 돼도 a는 그대로 남아있다.
그러고 test함수를 더 호출하게 되면, a가 이미 만들어져있고, 초기값은 한번만 수행하게 되므로
static int a로 값이 10으로 초기화 되는 것이 아니고 11인 상태에서 a++가 돼서 11-> 12로 a값이 연산되게 된다.
그러므로 11, 12가 출력된다.
결론: 정적변수는 메모리에 한번 올라가면, 초기값을 안주고 메모리 그대로 올라간다.
ex1
#include<stdio.h>
void funcCount();
int main(void) {
int num;
for(num = 0; num <2; num ++)
funcCount();
return 0;
}
void funcCount() {
int num = 0;
static int count;
printf("num = %d, count %d₩n", ++num, count++);
}
해설
**참고
void funcCount();
int main(void) {
main함수 밑에 funcCount라는 함수가 있다고 지시해주는 것
for(num = 0; num <2; num++)
funcCount();
num | |
초기값 | 0 |
int num = 0;
static int count; -> STATIC변수로 선언하면, 0이 기본값으로 설정
printf("num = %d, count = %d₩n", ++num, count++);
++num | num | STATIC count | count++ | |
초기값 | 0 | 0 | ||
funcCount num = 0 | 1 | 1 | 0 | 1 |
지역변수는 초기화 정적변수는 그대로 | 0 | 1 | ||
funcCount num = 1 | 1 | 1 | 1 | 2 |
지역변수는 초기화 정적변수는 그대로 | 0 | 2 |
num | |
초기값 | 0 |
0<2 -> 참 funcCount()수행 | num = 1, count = 0 |
1<2 ->참 funcCount()수행 | num = 1, count = 1 |
2<2->거짓 for문을 빠져나온다. | - |
답
num = 1, count = 0
num = 1, count = 1
ex2
#include<stdio.h>
void main() {
int i = 0, sum = 0;
while(i <3) {
sum = sum +fo();
i++;
}
printf("sum = %d₩n", sum);
}
int fo(void){
int var1 = 1;
static int var2 = 1;
return(var1++) + (var2++);
}
해설
i | sum (sum +fo()) | |
초기값 | 0 | 0 |
while(i <3) {
sum = sum +fo();
i++;
i | sum (sum +fo()) | |
초기값 | 0 | 0 |
0<3 -> 참 | 0 | 0+2 = 2 |
1<3 -> 참 | 1 | 2+3 = 5 |
2<3->참 | 2 | 5+4 = 9 |
3<3 -> 거짓 while문 나온다. | 9 |
int var1 = 1;
static int var2 = 1;
return(var1++) + (var2++);
fo
var1 | STATIC var2 | (var1++) + (var2++) | |
초기값 | 1 | 1 | |
1 | 1 | 1+1 = 2 | |
var1++,var2++ | 2 | 2 | |
지역변수 초기화 | ->1(int var1 = 1) | 2 | |
1 | 2 | 1+2 = 3 | |
var1++,var2++ | 2 | 3 | |
지역변수 초기화 | ->1(int var1 = 1) | 3 | |
1 | 3 | 1+3 = 4 | |
var1++,var2++ | 2 | 4 | |
지역변수 초기화 | - | 4 |
답 sum = 9
ex3
#include<stdio.h>
void main() {
int s1, s2;
s1 = funcA(2);
printf("F1 = %d", s1);
s1 = funcA(3);
printf("F2 = %d", s1);
s2 = funcB(2);
printf("F3 = %d", s2);
s2 = funcB(3);
printf("F4 = %d", s2);
}
int funcA(int n) {
static int s = 1;
s *= n;
return s;
}
int funcB(int n) {
int s= 1;
s *= n;
return s;
}
해설
main
s1 | s2 | |
초기값 |
s1 = funcA(2); -> 2를 들고 funcA호출
printf("F1 = %d", s1);
s1 = funcA(3); -> 3를 들고 funcA호출
printf("F2 = %d", s1);
s2 = funcB(2);-> 2를 들고 funcB호출
printf("F3 = %d", s2);
s2 = funcB(3);-> 3를 들고 funcB호출
funcA
n | STATIC s | s = s*n | ||
초기값 | 1 | |||
int n = 2 | 2 | 1 | 2*1 = 2 | F1 |
지역변수 초기화 | 2 | |||
int n = 3 | 3 | 2 | 3*2 = 6 | F2 |
지역변수 초기화 | 6 | |||
함수 종료 후 STATIC 초기화 | - |
funcB
n | s | s = s*n | ||
초기값 | 1 | |||
int n = 2 | 2 | 1 | 2*1 = 2 | F3 |
지역변수 초기화 | - | - | ||
int n = 3 | 3 | 1 | 3*1 = 3 | F4 |
지역변수 초기화 | - | - |
답:
F1 = 2
F2 = 6
F3 = 2
F4 = 3
ex4
#include<stdio.h>
int a = 10;
int b = 20;
int c = 30;
void main() {
func();
func();
printf("a=%d, b=%d, c=%d₩n", a, b c);
}
void func(void) {
static int a = 100;
int b = 200;
a++;
b++;
c = a;
}
해설
전역변수
a | b | c | |
초기값 | 10 | 20 | 30 |
a++;
b++;
func
STATIC a | b | |
func 초기값 | 100 | 200 |
func | 101 | 201 |
지역변수 초기화 | 101 | - |
func 초기값 | 101 | 200 |
func | 102 | 201 |
지역변수 초기화 | 102 | - |
함수 종료 후 모두 초기화 | - | - |
c = a;
c는 함수 내에서 선언되지 않았기 떄문에 전역 변수 c에 a를 할당하면 된다.
전역변수
a | b | c | |
초기값 | 10 | 20 | 30 |
func() | 101 | ||
func() | 102 | ||
최종 | 10 | 20 | 102 |
printf("a=%d, b=%d, c=%d₩n", a, b c);
a = 10, b = 20, c = 102
'iOS > 정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 - 재귀함수 (재귀함수 하나만 쓰는 경우) (0) | 2022.06.24 |
---|---|
기사 시험 큐넷 접수 꿀팁 전수(실패하고 울기 없기..) (10) | 2022.06.23 |
[정보처리기사] C언어 - 함수에 주소를 전달하는 예제3 (2) | 2022.06.22 |
[정보처리기사] C언어 - 함수에 주소를 전달하는 예제2 (7) | 2022.06.22 |
[정보처리기사] C언어 - 함수가 주소를 리턴하는 경우. (0) | 2022.06.22 |