변수의 종류(쉽게쉽게)
지역변수: 지역안에서만 사용
전역변수: 공동으로 쓰는 것
정적변수: 공동으로 쓰는 것
동적변수: 그때 그때 만들어서 사용
지역변수란?
- 함수/블록 안에서 선언하는 변수
- 함수/블록의 종료와 함께 메모리상에서 소멸
- 초기값이 없으면 쓰레기 값이 들어감
- 스택 영역에 저장됨
ex.
void main(){
if ( 1 ) { // 1은 참이니까 블록 안으로 들어감
int num1 = 10; // num1이라는 공간에 10의 값을 할당
printf("%d, num1); // 10 출력됨
} // 블록 끝남
printf("%d", num1); // 블록 끝났으니까 메모리상에서 소멸됨
}
전역변수란?
- 함수 블록 밖에서 선언하며, 전체 함수에 영향을 미친다.
- 프로그램이 종료될 때 메모리상에서 소멸
- 초기값이 없으면 0값이 들어감
- 데이터 영역에 저장됨
ex.
int num1; // {}안에 없으므로 전역변수
void main(){
num1 = 10; // 메모리상에 num1에 10 할당
printf("%d", num1); //10출력
func(); // 하단 func로 제어권을 넘겨준다
printf("%d", num1); // func에서 20할당 했으니까, num1에 20할당한 20출력
}
void func(){
num1 = 20; // num1에 20 할당 후 제어권 다시 상단으로 돌아가
}
정적변수란?
- 전역변수와 거의 비슷하다
- static으로 선언하며, 선언된 블록 내에서만 사용 가능
- 함수가 종료되어도 소멸되지 않고, 값이 그대로 유지됨
- 프로그램이 종료될 때 메모리에서 소멸
- 초기값이 없으면 0이 입력되고, 단 한번만 초기화
- 데이터 영역에 저장됨
- static으로 사용
ex. (코드 진행 순 상단->하단, 검->파->빨)
void main(){
add(10); // 10을 가지고 add함수를 호출
add(5); // 5를 가지고 add함수 호출
add(3); // 3을 가지고 add함수 호출
}
int add(int i) { // i =10 // i=5 // i=3
static int sum = 0; // sum이라는 공간에 0 할당 // sum이 메모리상에 이미 10으로 할당 돼있으므로 무시한다 // sum에 15가 할당돼있으므로 무시한다
sum = sum + i; // 0+10 = 10 sum에 10 할당 // 10+5로 sum에 15로 할당 // 15+3으로 sum에 18로 할당
printf("sum:%d₩n", sum); // sum공간에 10이 있으므로 10 할당 // 여기서 원래라면 함수가 끝나면서 사라져야 되는데 static변수이므로 로 사라지지 않고 그대로 다시 올라가게 됨 // sum에 15값 출력 // 다시 올라가 // sum에 18값 출력
}
위 함수를 결과로 출력하게 되면
sum: 10
sum: 15
sum: 18
다시 올라가는 것이 재귀함수처럼 보이는데..?
다시 올라가는 것을 보면 재귀함수의 기능을 가지고 있는 것처럼 보이나,
재귀는 아니고 코드를 하단으로 실행하다 보니 호출할 때마다 저장돼있는 값이 달라져서 재귀처럼 보이는 것일 뿐
동적변수란?
- 메모리 동적할당으로 생성되는 변수
- run time시간에 메모를 할당
- 동적 기억장소에 할당하여 메모리 낭비를 피하려는 목적
- 무조건 포인터를 사용해야 함
- 힙 영역에 저장됨
'iOS > 정보처리기사' 카테고리의 다른 글
[정보처리기사] C언어 - 연산자 우선순위 (0) | 2022.05.23 |
---|---|
[정보처리기사] C언어 - 산술연산자(a++, ++a, a+= 등) (0) | 2022.05.20 |
[정보처리기사] C언어 - 변수 (0) | 2022.05.18 |
[정보처리기사] C언어 - 컴파일러, 인터프리터 (0) | 2022.05.18 |
[정보처리기사] 비전공자 2022년 2회 정보처리기사 필기 합격 후기/공부법 (2) | 2022.04.25 |