전역 변수(extern)와 정적 변수를 선언할 때 값을 초기화했으면 데이터 섹션(.data)에 생성되고, 초기화하지 않았으면 BSS 섹션(.bss)에 생성되며 0이 들어갑니다.
ㅇ auto
- 자동변수를 선언할 때 auto를 붙임
- 전역변수에는 auto를 붙일 수 없음
- 자동변수는 현재 블록이 끝나면 사라짐
- 자동변수는 초기화 해주지 않으면 쓰래기값이 들어감
- 가장 많이 사용하는 변수는 자동변수이다. 그래서, 생략한다. -> 우리가 그냥 쓰는게 이거라는 말!
- example)
int num = 10; 을 보면, num은 자동변수이자 지역변수이다.
ㅇ static
- 정적변수를 선언할 때 static을 붙임
- 프로그램이 시잘될 때 변수를 초기화 / 다시 호출되면 무시
- 다른 소스 파일(외부)에 있는 정적 전역 변수는 extern으로 사용할 수 없음
(전역변수에 static을 붙이면 변수의 범위를 파일로 제한)
- 정적변수는 초기화 하지 않으면 0이 들어감
- 정적변수는 함수의 매개변수로 사용할 수 없음
- 정적 함수를 사용하면 같은 이름을 가진 함수를 파일마다 만들 수 있음.
따라서, 정적 함수는 기능이 여러 파일로 분리되어 있을 때 각 파일 안에서만 사용하는 기능을
구현할 수 있습니다.
ㅇ register
- 레지스터 변수를 사용하면, 변수는 메모리 대신 CPU의 레지스터를 사용함. -> 일반변수보다 빠름
- 레지스터 갯수는 한정되어있어 register을 붙인다고해서 모두 레지스터를 사용하지는 않음
- 메모리에 생성되는게 아니라서 변수의 주소를 구할 수 없음(& 사용X),
변수에 주소는 저장할 수 있으므로 역참조(*) 사용 가능
- 반복 횟수가 매우 많을 때 유용
- 지역변수에만 사용할 수 있고, 전역변수에는 사용 불가
**추가로 형 한정자라는 것이 있음(const, volatile, restrict, _Atomic)