본문 바로가기

C, C++

변수 종류

변수의 종류는 크게 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