프로그램 메모리 주소
- 컴퓨터에서 프로그램이 실행되기 위해서는 프로그램이 메모리에 적재(Load)되어야 함
- 당연히 프로그램의 크기를 충당할 수 있을 만큼의 메모리 공간이 있어야 함
- 일반적인 컴퓨터의 운영체제는 메모리 공간을 네 가지로 구분하여 관리함
코드 영역 - 소스코드
데이터 영역 - 전역 변수, 정적 변수
힙 영역 - 동적 할당 변수
스택 영역 - 지역 변수, 매개변수
전역 변수
- 전역 변수(Global Variable)란 프로그램의 어디서든 접근 가능한 변수
- main 함수가 실행되기도 전에 프로그램의 시작과 동시에 메모리에 할당됨
- 프로그램의 크기가 커질수록 전역 변수로 인해 프로그램이 복잡해질 수 있음
- 메모리의 데이터(Data) 영역에 적재됨
#include <stdio.h>
#include <stdlib.h>
int a = 5; // 전역 변수
void changeValue() {
a = 10;
}
int main(void) {
printf("%d\n", a);
changeValue();
printf("%d\n",a);
system("pause");
return 0;
}
지역 변수
- 지역 변수(Local Variable)란 프로그램에서 특정한 블록(Block)에서만 접근할 수 있는 변수를 말함
- 함수가 실행될 때마다 메모리에 할당되어 함수가 종료되면 메모리에서 해제됨
- 메모리의 스택(Stack) 영역에 기록됨
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int a = 7;
if (1) {
int a = 5;
}
printf("%d", a);
system("pause");
return <#expression#>;
}
정적 변수
- 정적 변수(Static Variable)란 특정한 블록에서만 접근할 수 있는 변수
- 프로그램이 실행될 때 메모리에 할당되어 프로그램이 종료되면 메모리에서 해제됨
- 메모리의 데이터(Data) 영역에 적재됨
#include <stdio.h>
#include <stdlib.h>
void proccess() {
static int a = 5; // 변수 a가 메모리상에 적재됨
a = a + 1; // process 함수를 불러올 때마다 a에 1을 더해 나감
printf("%d\n", a); // 더해진 a값을 출력
}
int main(void) {
proccess(); // 6
proccess(); // 7
proccess(); // 8
system("pause");
return 0;
}
레지스터 변수
- 레지스터 변수(Register Variable)란 메인 메모리 대신 CPU의 레지스터를 사용하는 변수
- 레지스터는 매우 한정되어 있으므로 실제로 레지스터에서 처리될지는 장담할 수 없음
#include <stdio.h>
#include <stdlib.h>
int main(void) {
register int a = 10, i; // 레지스터 변수로 int형 a를 만들어서 10값을 넣어주고, i 변수 추가
for (i = 0; i < a; i++) { // i는 0부터 a까지 반복
printf("%d ", i); // i 출력
}
system("pause");
return 0;
}
함수의 매개변수가 처리될 때
- 함수를 호출할 때 함수에 필요한 데이터를 매개변수로 전달함
- 전달 방식은 <값에 의한 전달 방식>과 <참조에 의한 전달> 방식이 있음
- 값에 의한 전달 방식은 단지 값을 전달하므로 함수 내에서 변수가 새롭게 생성됨
- 참조에 의한 전달 방식은 주소를 전달하므로 원래의 변수 자체에 접근할 수 있음(비유하자면 전역 변수에 더 가까움)
값에 의한 전달 방식(ADD 함수)
- ADD 함수로 두 개의 값을 넣으면 새롭게 두 변수가 메모리 내에 할당되어 처리됨
- 따라서 원래 변수의 값에는 영향을 미치지 못함
#include <stdio.h>
#include <stdlib.h>
void add(int a, int b) {
a = a + b;
} // 이 함수 안에서만 적용
int main(void) {
int a = 7;
add(a, 10);
printf("%d\n", a);
system("pause");
return 0;
}
참조에 의한 전달 방식(ADD 함수)
- 참조에 의한 전달 방식은 함수의 매개변수로 값을 전달하는 것이 아니라 변수의 조소(포인터 값)를 전달함
- 이러한 방식을 이용하면 원래 변수의 값에 접근하여 값을 변경할 수 있음
- 참조에 의한 전달 방식은 단지 매개변수로 포인터(Pointer) 변수를 보낼 뿐 딱히 특별한 게 아님
#include <stdio.h>
#include <stdlib.h>
void add(int *a) {
(*a) = (*a) + 10; // 주소값 자체에 10을 더함
}
int main(void) {
int a = 7;
add(&a); // a의 주소값을 불러옴
printf("%d\n", a);
system("pause");
return 0;
}
- C언어에서는 전역 변수, 지역 변수 등의 다양한 종류의 변수가 사용됨
- 함수에 데이터를 전달하는 방법은 값을 전달하는 방식과 주소를 전달하는 방식 두 가지가 있음