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 |