C 언어 - 메모리주소

컴퓨터/C

728x90
반응형

프로그래밍과 메모리

프로그래밍과 메모리는 아주 밀접한 관련이 있습니다. 

프로그래밍을 한다는 것은 메모리에 각종 데이터를 저장하고 그 데이터를 CPU나 각종 연산장치를 통해 계산하는 것이기 때문입니다. 

오늘날 다양한 프로그래밍 언어와 프로그램 기법들이 있지만 이런 방법을 어떻게 구현시켰냐의 차이지 근본적인 개념은 같습니다. 본문에서는 C언어 프로그래밍에서 메모리를 어떻게 활용하여 구현하는지에 대하여 알아보도록 하겠습니다.

 

C언어와 메모리 그리고 포인터 

C언어는 개발되고 사용한지 오래된 언어입니다. C언어가 생길 1970년대 무렵에는 현재와 비교해서 컴퓨터의 사양이 매우 낮았습니다. 그래서 그 당시 프로그래밍 언어의 가장 궁극적인 목표는 한정된 자원을 얼마나 효율적으로 활용할 수 있냐가 아주 중요한 목표였습니다.

그러한 배경때문에 고급언어 중 가장 하드웨어와 가까운 언어라고도 불리며, 메모리에 직접적인 접근을 가능하게 하는 문법이 있습니다. 이것을 포인터라고 부르며, 컴퓨터에 관심이 있는 사람들은 한 번씩 들어봤을 겁니다.

 

C 언어를 통해 메모리 주소를 알아보자.

포인터에 대한 내용은 다음 글에서 언급하도록 하고, 본문에서는 C언어를 통해 메모리의 주소를 먼저 알아보겠습니다. 

메모리의 구조를 대략적으로 표현하자면 위의 그림처럼 되어있습니다. 

사용자가 C언어를 통하여 지역변수와 매개변수를 사용하면 스택영역에 그 변수의 데이터가 저장되고,

전역 변수나 정적 변수를 사용하면 데이터 영역에 변수가 저장되고, 함수나 조건, 반복문을 정의하면 그 구조의 형태가 코드 영역에 저장이 되는 것입니다. 

 

그렇다면 변수 a와 b를 선언해 보도록 합시다.

#include<stdio.h>
int main()
{
    char a;
    int b;
    return 0;
}

변수를 선언한다는 것은 메모리공간을 할당받고 그 공간의 이름을 정의하는 것이라고 했습니다. 

지역변수 2개를 선언한 프로그램을 실행시키면, 현재 사용하고 있지 않은 메모리 영역 어딘가를 변수 a와 b로 지정해 줍니다.

사용자는 변수의 이름을 통하여 그안의 값을 변경하고 활용할 수 있습니다.

하지만 컴퓨터의 입장에서는 

  • 변수의 이름이 정의된 메모리의 주소를 알아야 됩니다.

그리고 C언어에서는 사용자가 메모리의 주소를 볼수있는 기능을 제공해 줍니다.

그럼 실제로 C언어를 통해 변수 a,b의 메모리 주소를 보도록 하겠습니다.

#include <stdio.h>

int main()
{
    char a;
    int b;
    printf("변수 a의 주소 : %p\n", &a);
    printf("변수 b의 주소 : %p\n", &b);
    return 0;
}
  • 변수의 주소를 출력하기 위해 printf함수와 주소 서식 지정자인 % p를 사용합니다.
  • 변수를 선택할 때 변수의 값이 아닌 변수의 주소를 선택하기 위해 &(주소 연산자)를 사용합니다.

해당 프로그램을 실행하게 되면 해당 변수가 실제 위치된 메모리의 주소를 눈으로 확인할 수 있습니다.

이 메모리 주소는 항상 변수가 생길 때 마다 컴퓨터의 사용하지 않는 메모리 공간에 정의하므로 다른 것이 정상입니다.!

 

메모리 주소와 자료형

메모리는 1Byte 단위로 구성되어 있습니다. 100Byte의 메모리 공간이라면 100개의 메모리 주소가 존재합니다. 

*메모리 주소는 16진수로 표기되어 있습니다 

위의 예제에서 변수 a는 char형 1byte고 변수 b는 int형 4byte입니다. 그리고 메모리 주소를 출력할 때는 항상 해당 데이터의 시작 주소를 나타내 줍니다. 그 이후 자료형까지의 정보를 읽어주는 것입니다.

이제 우리는 실제 데이터들이 메모리 위에 올라가는 것에 대하여 이해했고, C언어를 통해 데이터의 실제 메모리 주소를 알아보는 방법에 대하여 알아보았습니다. 이 개념을 꼭 이해를 하고 있어야만 포인터를 알아가는데 좀 더 수월해질 것입니다.

 

요약

  • 프로그래밍과 메모리는 밀접한 관계이며, 프로그램 데이터가 메모리 위에 저장된다.
  • 모든 프로그래밍 언어는 위의 개념이 접목되어 있다.
  • C언어의 경우 조금 더 위 개념을 사용자가 컨트롤할 수 있게 만들어 놨다.
  • 이런 것을 C언어에서는 포인터라 부른다.
  • C언어에서 어떤 변수의 주소를 접근하고 싶으면 &(주소 연산자)를 활용해야 된다.
  • 주소를 출력하여 보고 싶으면 printf함수와 % p 서식 지정자를 사용한다.
  • 변수들이 기억하는 메모리 주소는 해당 변수의 시작 주소이며 , 자료형으로 끝을 판단한다.
  • 메모리는 1Byte 단위로 주소가 있으며, 16진수로 표기를 하고 있다.
728x90
반응형

'컴퓨터 > C' 카테고리의 다른 글

C 언어 - 다차원 배열  (0) 2021.06.14
C 언어 - 포인터 / 포인터 변수  (0) 2021.06.13
C 언어 - 배열과 문자열  (0) 2021.06.09
C 언어 - 지역변수와 전역변수  (0) 2021.06.08
C 언어 - 용어 알아보기  (0) 2021.06.08

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :