변수의 종류는 크게 4가지로 나눌 수 있습니다.
1. 지역변수
블록 내부({})에서 정의되는 변수로, 그 블록 내부에서만 유효한 변수입니다.
#include <stdio.h>
void Func() {
int i = 5;
i++;//i에 1을 더한다. 가능
printf("%d\n",i);
}
void main() {
Func();//6 출력
Func();//6 출력
//i=7; 불가능
return 0;
}
지역변수는 해당 블록에 진입할 때 변수가 만들어지고 블록이 끝날 때 정리(폐기) 됩니다.
그런데 두 블록에서 각각 같은 이름의 변수를 선언해도 정상적으로 사용 가능합니다. 같은 블록에서 이름이 중복되지 않으면 됩니다.
#include <stdio.h>
void Func() {
int i = 5;//가능
}
void main() {
int i = 5;//가능
//int i = 3;불가능
return 0;
}
지역변수를 정의하고 초기값을 대입하지 않으면 변숫값이 정해지지 않습니다. 이 말은 즉, 메모리에 원래 있던 값이 되기 때문에 무슨 값이 될지는 알 수 없습니다. 이 값을 그래서 쓰레기 값이라고 합니다.
#include <stdio.h>
void main() {
int i;
printf("%d",i);//i는 쓰레기 값이라서 무슨 값이 출력될 지 알 수 없습니다. 프로그램을 실행할 때마다 매번 바뀝니다.
return 0;
}
2. 전역변수
함수 밖에서 정의되는 변수로 프로그램 전체에서 유효한 변수입니다.
#include <stdio.h>
int i = 5;
void Func() {
i = 6;//가능
}
int main() {
i = 7;//가능
return 0;
}
전역변수는 프로그램이 시작될 때 할당되며, 프로그램이 끝날 때 정리됩니다.
지역변수와 다르게 변수를 정의할 때 초기값을 지정하지 않으면 쓰레기 값이 아닌 0으로 초기화됩니다.
3. 정적 변수
함수 안에서 정의되는 변수이지만 함수를 호출할 때마다 할당되는 것이 아닌 전역변수처럼 사용됩니다.
#include <stdio.h>
void Func() {
static int i = 0;//앞에 static을 붙입니다.
i++;
printf("%d\n",i);
}
void main() {
Func();//1 출력
Func();//2 출력
//i = 5; 불가능
}
위처럼 함수안에서만 사용 가능하지만 전역변수의 특징을 가지고 있어 함수가 끝나도 i 변수는 그대로 있고 다시 호출했을 때 이미 있는 i에 1이 또 더해져서 2가 됩니다.
그리고 초기값을 지정하지 않으면 0으로 초기화됩니다.
지역변수와 마찬가지로 여러 함수에서 같은 이름의 변수를 정의해 사용할 수 있습니다.
4. 레지스터 변수
다른 특징은 지역변수와 같지만 변수가 정의될 때 메모리에 할당되는 것이 아닌 CPU의 레지스터라는 저장 공간에 할당됩니다.
레지스터는 메모리보다 더 빠르지만 현재 컴파일러는 이것을 지원하지 않기 때문에(정확히 말하면 오류 없이 컴파일되지만 실행 시 무시됩니다.) 그냥 이런 게 있다는 것만 알면 됩니다.
레지스터 변수를 선언할 때 앞에 register를 붙입니다.
'C, C++' 카테고리의 다른 글
함수 오버로딩 (0) | 2019.12.03 |
---|---|
변수, 함수 선언과 정의 (0) | 2019.12.03 |
포인터 (0) | 2019.12.02 |
공용체 (0) | 2019.12.02 |
구조체 정렬 및 원리 (0) | 2019.11.29 |