프로그램 메모리 주소

- 컴퓨터에서 프로그램이 실행되기 위해서는 프로그램이 메모리에 적재(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언어에서는 전역 변수, 지역 변수 등의 다양한 종류의 변수가 사용됨

- 함수에 데이터를 전달하는 방법은 값을 전달하는 방식과 주소를 전달하는 방식 두 가지가 있음

 

'C언어' 카테고리의 다른 글

동적 메모리 할당  (0) 2020.12.08
다차원 배열과 포인터 배열  (0) 2020.12.07
문자열  (0) 2020.12.05
문자  (0) 2020.12.04
포인터  (0) 2020.12.04
Posted by khon98
,