[C]변수와 연산자(2)
메모리 구조
변수는 메모리의 주소를 기억하는 역할을 한다. 메모리 주소란 메모리 공간에서의 정확한 위치를 식별하기 위한 고유 주소이다. 변수를 참조할 때는 메모리의 주소를 참조한느 것이 아닌, 해당 주소에 저장된 데이터를 참조한다.따라서 변수는 데이터가 저장되는 주소 뿐만 아니라, 저장된 데이터의 길이와 형태에 관한 정보도 같이 기억해야한다.
하나의 메모리 공간은 8개의 비트로 이루어진 1바이트의 데이터가 저장되는데, 해당 변수의 이름은 가장 첫 번째 메모리 주소를 가리키게 된다.
컴파일러의 변수 선언
선언: 시스템은 변수가 선언되면, 자료형(메모리 크기, 저장될 데이트)을 참고하여 메모리에서 적절한 영역의 공간을 할당해준다.
참조: 할당받은 변수를 참조할 때 (printf("%d", num)), 시스템은 해당 변수명이 가리키고 있는 주소를 찾아간 후 내부의 값을 참조한다.
변수의 유효범위
프로그램을 실행하면 운영체제는 이를 위한 메모리 공간을 할당해준다. C언어에서 변수에게 할당되는 메모리는 크게 스택,힙,데이터 영ㅇ역으로 구분된다.
스택영역: 함수 내의 지역변수와 매개변수가 저장되는 메모리 영역
데이터영역: 전역변수, 정적, 배열, 구조체 등이 할당되는 영역, 프로그램 시작과 동시에 할당되고 종료시 소멸된다.
힙영역: 동적으로 할당하고 (malloc, relloc, free) , free() 함수로 메모리 반환한다.
1. 지역변수
한 블록 내에서 선언된 변수를 뜻한다. 블록 내에서만 유효하며 블록 종료시 메모리에서 사라진다. (스택 메모리에 저장, 최기화하지 않으면 쓰레기값으로 초기화된다.) 함수의 매개 변수 또한 함수 내에서 정의되는 지역 변수로 취급한다.
2. 전역변수
함수의 외부에서 선언된 변수를 뜻한다. (대개 코드의 최상단) 데이터 영역에 정의되므로 프로그램 어디에서든 접근할 수 있고 프로그램 종료시에만 메모리에서 사라진다. 지역 내에서는 지역변수가 전역변수보다 우선시된다.
3. 정적변수
static 키워드로 선언한 변수로, 지역변수와 전역변수의 특징 모두 가진다. 단 한번만 초기화되며 프로그램이 종료되어야 메모리상에서 사지고, 해당 함수 내에서만 접근 가능하다.
4. 레지스터 변수
지역변수를 선언할 때 register 키워드를 붙여 선언한 변수로, CPU의 레지스터 메모리에 저장되어 빠르게 접근가능하다.