변수의 속성 3가지: 범위(전역 or 지역), 생존 기간(정적 할당 or 자동 할당), 연결(외부 or 내부)
전역 변수: 범위: 프로그램 시작~종료 / 생존 기간: 정적 할당 / 연결: 외부 연결 / 0으로 자동 초기
정적 지정자(static): 전역 변수, 지역 변수 앞에 모두 붙일 수 있다. 프로그램이 종료되어도 자동 소멸되지 않고 남아있다. 0으로 자동 초기화되며, 초기화는 단 한 번만 수행된다. 내부 연결만 가능하다.
정적 전역: 함수 외부 정의 / 전역 변수(외부연결 불가) / 프로그램의 시작~종료(정적 할당)
정적 지역: 함수 내부 정의 / 지역 변수 / 블록의 시작~종료(자동 할당)
레지스터 지정자(register): 지역 변수에만 사용 가능하다. 데이터를 메모리가 아닌 CPU의 일부분인 레지스터에 저장하여 읽고 쓰는 속도가 매우 빠르다. 블록의 시작과 함께 레지스터에 할당되고 블록이 종료됨과 동시에 레지스터에서 제거된다. 레지스터 변수에 주소 연산자 &을 적용하면 컴파일 오류가 발생함을 유의하자. 레지스터에는 주소가 없기 때문이다.
레지스터: 함수 내부 정의 / 지역 변수 / 자동 할당
볼레타일 지정자(volatile): 하드웨어가 수시로 변수의 값을 변경하는 경우에 사용한다. 문장을 실행할 때마다 변수의 값을 메모리에서 새롭게 읽어와야 한다. volatile로 지정하는 컴파일러는 최적화를 중지한다.
외부 연결(extern): 다른 소스파일에서 변수를 정의 및 초기화하고 다른 파일에서 참조한다. 기본적으로 모든 전역 변수는 외부 연결이 가능하다. extern으로 정의된 변수에는 저장공간이 할당되지 않는다.