대학교 1학년 처음 C프로그래밍을 접해봐서 아무것도 모른 채 무작정 코딩하는법, 문법만 주구장창 외운 기억이 있다.
그렇게 공부를 하니 제대로 이해를 못한 채 한학기가 끝나버렸다.
방학때 스스로 공부를 다시 천천히 해보니까 하나 둘씩 원리가 이해되면서 퍼즐이 맞춰지는 기분이 들었다.
복습하는 차원으로 다시 정리를 하고 더 나아가서 컴퓨터 구조인 메모리 관점에서도 확인해 보자.
포인터
포인터란 각자가 표현하는 방식이 다양하게 있지만 나는 '주소를 가리키는 것'이라고 표현하고 싶다.
백문이 불여일견 빠르게 예제를 통해 확인하자
위와 같이 코드를 작성한 후 실행하면 다음과 같은 결과가 나온다.
이런 코드를 구간별로 나눠서 자세히 그림을 통해 분석해보자.
1번 구간
변수 3개를 선언하여 메모리 공간이 할당되었고 a에 3을 대입했다.
a의 값은 3이며 주소값(편하게 끝4자리)은 6148이다.
2번 구간
13번 줄 : pa에 a의 주소값을 대입 한다.
16번 줄 : pa가 가리키는 번지(주소값)의 값(데이터)을 5로 대입해라
즉 a의 값이 3에서 5로 변경된다.
3번 구간
마지막 구간이 포인터의 개념이 상당히 많이 내포되어있다.
21번줄 : ppa에 pa의 주소값을 대입해라.
*ppa는 ppa가 가리키는 주소값 의 데이터를 의미하기 때문에 6148을 출력.
**ppa는 위에 *ppa가 가리키는 주소값의 데이터를 의미하기 때문에 5를 출력한다.
이때, ppa의 주소값을 출력하면 6160이라는 값이 나온다.
무언가 이상하다.
int는 4byte라서 a의 주소와 pa의 주소값은 정확히 4byte가 차이난다.
그러나 pa와 ppa 두 주소값의 차이는 8이다.
우리는 이를 int라고 선언을 했음에도 불구하고 8byte차이가 난다니....?
그럼 다른 자료형의 포인터 변수는 얼만큼의 메모리 공간을 차지하는지 확인해보자.
포인터의 메모리공간 할당
일반변수의 자료형 크기는 다음과 같다.(64bit PC기준)
char = 1byte
short = 2byte
int = 4byte
float = 4byte
double = 8byte
그렇다면 포인터변수를 선언하면 크기가 어떤지 결과를 직접 sizeof()함수를 통해 확인해보자.
신기하게도 자료형에 관계 없이 전부 8byte라고 출력을 한다.
왜 그럴까?!
다시한번 강조하지만 포인터는 메모리의 주소를 가리키는 자료형이기 때문에 기본적으로 os(운영체제)의 bit에 따라 값이 정해져 있다.
이는 32bit, 64bit pc에 따라 달라진다.
32bit 컴퓨터는 1word가 4byte(8bit = 1byte)이기 때문에 모든 포인터변수의 크기는 4byte인 반면
64bit 컴퓨터는 1word가 8byte라서 모든 포인터변수의 크기는 8byte이다.
그렇다면 여기서 또 의문점이 발생한다.
이렇게 모든 포인터의 메모리 크기가 8byte라면 처음 포인터 변수를 선언할 때 왜 int, char와 같이 자료형을 붙여줄까??
포인터에 자료형을 붙이는 이유
포인터자체의 용량은 8byte지만 포인터가 가리키는 주소값의 메모리는 자료형에 따라 달라진다.
포인터를 통해 int 연산이 이루어진다면 4byte씩 연산을 해야하며
char라면 1byte씩 연산이 이루어져야 하기 때문이다.
위와같은 코드를 확인해 보자.
배열 두개를 선언했지만 형태가 서로 다르게 int, char로 선언했다.
이를 어셈블리 영역으로 확인해보면 다음과 같은 내부연산이 이루어짐을 확인 할 수 있다.
빨간박스가 int형으로 생성된 배열이며 노란박스는 char형응로 생성된 배열이다.
먼저 int형의 메모리 주소값은 4byte씩 차이가 나면서 연산이 이루어지지만
char형의 주소값은 1byte씩 차이가 난다.
'C | C++' 카테고리의 다른 글
[C\C++] 소수 구하기 (0) | 2021.07.02 |
---|---|
[C\C++] 1부터 입력한 숫자까지의 자리수 개수 구하기(응용) (0) | 2021.06.27 |