2024. 3. 28. 12:25ㆍCS/C언어
C언어에서 포인터란, 메모리의 주소 값을 저장하는 변수이다. 포인터는 아래와 같이 선언한다.
int n = 150;
int *p = &n;
정수 값 150은 n이라는 변수 안에 저장되며, 이는 메모리 상에 어떤 공간에 할당된다. 150의 값을 가지는 n이 어떻게 메모리에 할당되는지 알아보자.
컴퓨터의 메모리 구조
컴퓨터에서 int 자료형이 저장될 때는 메모리 상에서 아래와 같이 저장된다. 메모리 주소 당 8자리 이진수가 들어가고, 이를 바이트(byte)라고 한다. 이때 이진수 하나를 비트(bit)라고 한다. 즉 8비트 = 1바이트 이다.

일반적인 컴퓨터에서 int를 저장할 때, 총 4바이트의 공간을 차지한다. 즉 0x51이라는 메모리 주소에 정수를 저장하고 싶다면 0x51~0x54의 4칸을 차지하는 것이다. 그러면 총 32비트를 사용할 수 있게 되는 것이므로 int라는 자료형에 저장 가능한 정수의 종류는 총 2^32 = 4,294,967,296개이다.
int값은 본래 양의 정수와 음의 정수를 모두 표현 가능하기 때문에, 32개 중 하나를 부호 비트로 사용하여 +, -를 결정하고, 나머지 31개를 수의 크기를 나타내는 데 쓴다. 즉 -2^31~2^31-1까지의 수가 표현 가능하다. 반면, 만약 음수를 사용하지 않는다고 가정한다면, 부호 비트를 할당할 수 없으므로 32개의 비트 모두 크기를 표현하는 데 쓸 수 있다. 이를 unsigned int 자료형이라고 한다.
(signed) int | -2,147,483,648~2,147,483,647 |
unsigned int | 0~4,294,967,295 |
어쨋든 중요한 것은 int 자료형을 저장할 때는 4개의 메모리 주소 공간(4byte)를 사용한다는 것이다.
포인터
int n = 150;
int *p = &n;
다시 정의 식으로 돌아오면, 150은 int이므로 총 4개의 byte를 할당 받는다. 이때 *p = &n으로 정의한 것은 아래와 같은 의미를 가진다.
- p는 150이 저장되는 4개의 byte 중 가장 작은 메모리 주소 하나를 저장하는 포인터 변수이다.
- *p는 선언할 때 p가 포인터 변수임을 나타낸다.
- & 연산자는 해당 문자가 저장된 곳의 메모리 주소를 반환한다.
컴파일러로 다음 코드를 컴파일하고 실행해 보자.
#include <stdio.h>
int main() {
int n = 150;
int *p = &n;
printf("%d\n", n);
printf("%d\n", &n);
printf("%d\n", p);
printf("%d\n", *p);
return 0;
}
이를 실행할 경우 아래와 같이 결과가 나온다.

여기서 605296852는 n이 저장된 메모리 주소 4byte 중 가장 앞에 있는 메모리 주소를 말한다. 이는 16진법으로 바꾸면 0x241418D4이므로, 메모리 상에서 아래와 같이 저장된 것이다.

150은 32비트짜리 이진법으로 바꾸면 00000000 00000000 00000000 10010110 인데, 대부분 컴퓨터는 가장 낮은 주소에 최하위 바이트(LSB)를 저장하는 리틀 엔디언(Little Endian) 방식을 따르므로 위와 같이 저장되는 것이다.
그런데 이상한 점이 있다. *p = &n으로 선언되었고, &n은 n의 메모리 주소를 나타내는 것인데 왜 printf("%d\n", *p); 는 150을 반환하는 것일까? 이는 * 연산자가 두 가지 기능이 있기 때문이다.
- 포인터 변수를 선언하는 기능: int *p와 같이 적으면 p가 포인터 변수임을 선언하는 기능이다.
- 역참조 기능: 이미 선언된 포인터 변수 p에 * 연산자를 적용하여 *p를 하면, p에 들어있는 데이터 값(int)을 반환한다.
그래서 우리는 분명히 선언할 때는 *p = &n이라고 했지만, 아래와 같이 코드를 실행해보면
#include <stdio.h>
int main() {
int n = 150;
int *p = &n;
if(*p == &n){
printf("yes");
}
else{
printf("no");
}
return 0;
}
포인터와 데이터(int)를 비교하고 있다는 경고문이 뜨면서 "no"가 출력된다.

'CS > C언어' 카테고리의 다른 글
[C언어] 포인터의 연산과 인수 전달 방법 (1) | 2024.03.29 |
---|