본문 바로가기

Data Structures and Algorithms

0.3.1. C 언어로 메모리를 다루는 방법 (포인터)

C언어로 자료구조와 알고리즘을 다루는 데 필수적인 포인터, 구조체, 메모리 레이아웃, 스택, 힙을 설명한다.


 

※ 포인터

포인터는 변수이다. 값을 저장하는 일반 변수와 달리 메모리 주소를 저장한다는 점이 다를 뿐이다.

 

데이터 형식* 포인터

INT 형식 메모리 주소를 저장하는 포인터는 다음과 같이 선언한다.

 

INT* PTR

다음과 같이 포인터에 주소값을 할당할 수 있다.

 

INT* PTR = 0xFF000000

주소 연산자 &를 이용해서 다른 변수의 주소를 할당할 수 도 있다.

 

INT A = 123;
INT* PTR = &A;

 

C언어에서는 포인터에 증감 연산자를 사용할 수 있다. 예로 INT 형식이 32비트(4바이트)인 시스템에서 기반 데이터 형식이 INT인 포인터에 ++ 연산자를 적용하면 주소값이 32비트 증가하고, -- 연산자를 적용하면 32비트 감소한다.

 

INT* PTR = 0x00001004;
printf("%x\n", PTR); // 0x00001004
printf("%x\n", --PTR); // 0x00001000
printf("%x\n", ++PTR); // 0x00001004

포인터의 증감 연산자는 배열을 다룰 때도 유용하다. C언어에서 배열은 배열에 할당된 메모리의 시작 주소를 갖고 있다. 배열의 주소가 아닌 데이터에 접근하려면 인덱스 연산자 [ ] 를 사용해야 한다. 

배열이 메모리 주소를 담고 있으므로, 포인터에 배열을 할당하면 포인터가 배열을 가리킬 수 있다. 

아래는 포인터에 배열 주소를 저장하는 예제이다.

 

INT ARR[5] = { 0, 1, 2, 3, 4 };
INT* PTR = ARR;

printf("%s\n", PTR == ARR ? "true" : "false"); // true 출력
printf("%d\n", *PTR); // ARR의 첫 번째 요소 0 출력

위 코드에서 PTR은 ARR의 첫 번째 요소의 주소, 즉 ARR[0]의 주소를 가리킨다. PTR에 ++ 연산자를 사용하면 PTR은 INT의 크기만큼 더해진 주소값을 갖게 되어 ARR[1]의 주소를 가리킨다. 

아래와 같이 출력할 수 있다.

 

PTR++;
printf("%d\n", *PTR);

 

-- 연산도 사용할 수 있으며, 아래와 같이 출력할 수 있다.

 

PTR--;
printf("%d\n", *PTR);

'Data Structures and Algorithms' 카테고리의 다른 글

0.3.2. C 언어로 메모리를 다루는 방법 (구조체)  (0) 2023.08.24
0.2. 알고리즘  (0) 2023.08.16
0.1 자료구조  (0) 2023.08.16