포인터를 사용해왔는데 포인터끼리의 연산은 어떤 방식으로 진행되는지 알아보겠습니다.
포인터로 선언한 변수에는 메모리 주소가 들어있습니다. 그렇기에 이 포인터 변수에 연산을 진행하게 되면 메모리 주소에 일정 숫자들을 연산하게 되는 것입니다. 즉, 포인터 연산은 메모리 주소를 옮겨 다니기 위해 사용됩니다.
메모리 주소가 커지는 상황을 순방향으로 이동(forward), 메모리 주소가 작아지는 상황을 역방향으로 이동(backward)라고 하면 forward는 0xFFFFFFFF로 이동하는 것이고 backward는 0x00000000로 이동하는 것으로 알고 있으면 됩니다.
포인터 연산은 *와 /는 사용할 수 없습니다. 대신, 아래와 같은 연산은 가능합니다.
포인터 + 값
포인터 - 값
포인터++
포인터--
++포인터
--포인터
여기서 더한 값만큼 주소 값에서 더해지는 것이 아닌 포인터 자료형의 크기만큼 더하거나 빠집니다. 즉, [sizeof(자료형) * 값]의 값만큼 증가되거나 감소됩니다.
*(포인터 + 값)
*(포인터 - 값)
위와 같이 포인터 연산과 동시에 역참조 연산을 통해 메모리 값을 가져올 수 있습니다. 그러면 포인터 연산이 먼저 실행된 후 역참조 연산이 이루어집니다.
void 포인터로 포인터 연산을 하고 싶다면 전 게시물에서 나왔던 형 변환을 사용한 후 포인터 연산을 들어가면 됩니다.
(자료형 *)void포인터 + 값
(자료형 *)void포인터 - 값
++(자료형 *)void포인터
--(자료형 *)void포인터
((자료형 *)void포인터)++
((자료형 *)void포인터)--
void 포인터 연산한 뒤 역참조를 하기 위해서는 위의 방법에 괄호를 전체를 묶어 앞에 *를 붙여주기만 하면 됩니다.
구조체 포인터로 포인터 연산도 가능한데 포인터 연산 부분을 괄호로 묶은 후 화살표 연산자를 사용하여 멤버에 접근하면 됩니다.
(포인터 + 값)->멤버
(포인터 - 값)->멤버
((struct 구조체이름 *)포인터 + 값)->멤버
((struct 구조체이름 *)포인터 - 값)->멤버
구조체는 구조체의 크기만큼 메모리 주소가 더해지거나 빠집니다. void 포인터에 구조체 포인터 연산을 하는 것은 위에 있는 예에서 밑에 두 개를 적용하면 됩니다.
'TeamH4C_ProjectH4C > 프로그래밍 언어' 카테고리의 다른 글
[TeamH4C_C언어] 열거형과 자료형 변환 (0) | 2021.04.11 |
---|---|
[TeamH4C_C언어] 구조체 추가 정리(비트 필드) (0) | 2021.04.11 |
[TeamH4C_C언어] 구조체와 공용체 사용 (0) | 2021.03.28 |
[TeamH4C_C언어] 문자열과 구조체 (0) | 2021.03.14 |
[TeamH4C_C언어] 포인터를 활용한 문제 (0) | 2021.03.06 |