WinCNT

C 언어 - 12. 컴퓨터가 변수를 처리하는 방법 본문

Study/C

C 언어 - 12. 컴퓨터가 변수를 처리하는 방법

WinCNT_SSS 2021. 9. 6. 01:40

프로그램 메모리 주소

  1. 프로그램이 실행되기 위해서는 메모리에 적재(Lord)되어야 한다
  2. 즉 프로그램의 크기를 충당할 수 있을 만큼의 메모리 공간이 필요하다
  3. 일반적인 컴퓨터 OS(운영체제)는 메모리 공간을 이하의 4가지로 구분하여 관리한다
    코드 영역 데이터 영역  힙 영역 스택 영역
    소스 코드 전역 변수
    정적 변수
    동적 할당 변수 지역 변수
    매개 변수
    • 코드 영역    : 한 줄 한 줄 실행시킬 수 있는 소스 코드
    • 데이터 영역 : 전역 변수, 정적 변수를 담고 있는 영역
    • 힙 영역       : 동적 할당 변수를 담는 영역
    • 스택 영역    : 함수마다 포함되어 있는 지역 변수, 매개 변수를 담는 영역

전역 변수(Global Variable)

  1. 프로그램의 어디서든 접근 가능한 변수
    메모리의 데이터 영역에 적재된다
  2. main 함수가 실행되기도 전에 프로그램의 시작과 동시에 메모리에 할당된다
  3. 프로그램의 크기가 커질 수록 전역 변수로 인해 프로그램이 복잡해질 수 있다
#include<stdio.h>

//전역 변수
//main 함수의 바깥에 선언
int a = 5;

//전역 변수는 다른 함수에서도 바로 접근 가능
void changeValue()
{
    a = 10;
}

int main(void)
{
    printf("%d\n", a);
    changeValue();
    printf("%d\n", a);
    
    system("pause");
    return 0;
}

정적 변수(Static Variable)

  1. 특정한 블록에서만 접근 가능한 변수
    메모리의 데이터 영역에 적대된다
  2. 프로그램이 실행될 때 메모리에 할당되며 프로그램이 종료되면 메모리에서 해제된다
    즉, 전역 변수와 지역 변수의 특징을 모두 가진다고 할 수 있음
#include<stdio.h>

void process()
{
    static int a = 5; //정적 변수 : 프로그램 실행 시 Lord됨
    a = a + 1; //변수가 Lord되어 있으면 다시 Lord하지 않고 접근하여 연산함
    printf("%d\n", a);
}

int main(void)
{
    process(); //6
    process(); //7
    process(); //8

    system("pause");
    return 0;
}

지역 변수(Local Variable)

  1. 프로그램의 특정한 블록(Block)에서만 접근 가능한 변수
    메모리의 스택 영역에 기록된다
  2. 함수가 실행될 때마다 메모리에 할당되며, 함수가 종료되면 메모리에서 해제된다
int main(void)
{
    //main 함수 블록의 지역 변수
    int LocalVar = 7;
    if (1)
    {
        //if 블록의 지역 변수
        int LocalVar = 5;
    }
    printf("%d\n", LocalVar); //7(main 함수 블록의 지역 변수가 출력)

    system("pause");
    return 0;
}

레지스터 변수(Register Variable)

  1. 메인 메모리 대신 CPU의 레지스터를 사용하는 변수
  2. 레지스터는 매우 한정되어 있으므로 실제로 레지스터에서 처리될지는 장담할 수 없다
    (실제로 레지스터에서 처리될지 아닐지는 컴파일러가 담당하는 부분)
#include<stdio.h>

int main(void)
{
    register int a = 10;
    register int i;
    for (i = 0; i < a; i++)
    {
        printf("%d ", i);
    }

    system("pause");
    return 0;
}

함수의 매개 변수(Parameter)가 처리될 때

  1. 매개 변수(Parameter)란 함수를 호출할 때 함수에 필요한 데이터전달하는 변수를 뜻한다
  2. 전달 방식은 2가지 존재한다
    1. 값에 의한 전달 방식
      값을 전달하는 방식으로 함수 내에서 새롭게 변수가 생성된다
    2. 참조에 의한 전달 방식
      메모리 주소를 전달하는 방식으로 원래의 변수 자체에 접근이 가능하다
#include<stdio.h>

//값에 의한 전달 방식
//새롭게 두 변수가 메모리 내에 할당되어 처리됨(원래의 변수에 영향 없음)
void addVal(int a, int b)
{
    a = a + b;
}

//주소에 의한 전달 방식
//함수의 매개 변수로 변수의 주소를 전달함(원래 변수에 접근 가능)
void addRef(int *a, int b)
{
    *a = (*a) + b;
}

int main(void)
{
    int a = 7;
    addVal(a, 10); //값에 의한 전달 방식
    printf("값에 의한 전달 방식   : %d\n", a); //7(변화 없음)

    addRef(&a, 10); //주소에 의한 전달 방식
    printf("주소에 의한 전달 방식 : %d\n", a); //17(원래 변수의 변화)

    system("pause");
    return 0;
}

 

 

 

'Study > C' 카테고리의 다른 글

C 언어 - 14. 동적 메모리 할당  (0) 2021.09.09
C 언어 - 13. 다차원 배열과 포인터 배열  (0) 2021.09.08
C 언어 - 11. 문자열  (0) 2021.09.05
C 언어 - 10. 문자  (0) 2021.08.05
C 언어 - 09. 포인터  (0) 2021.08.03