C언어 독학 포인터 연산
C언어 독학 포인터 연산
포인터는 변수의 메모리 주소를 저장하는 것입니다. 그렇다면 이 포인터 변수를 증가 또는 감소하면 어떻게 될까요? 포인터 변수에 저장된 건 메모리 주소이기 때문에 해당 자료형의 크기만큼 증가 또는 감소하게 되는데요. 예를들어 int형 포인터라면 1을 더하면 4byte 만큼 값이 변경 되는 것입니다. 예제에서 확인해볼게요.
▲ 요소가 세 개인 int형 배열 a를 선언하고 각각의 값을 초기화하고 있으며 포인터 변수 b에 그 주소를 저장하고 있습니다. 그리고 그 주소를 확인하기 위해서 printf() 함수로 주소를 출력하고 있는데요. 0015F9E4 이네요. 그리고 이 주소를 저장하고 있는 포인터 변수 b에 +1을 해봤습니다. 그랬더니 정확하게 4byte가 증가하는군요. 이 4byte가 증가한 이유는 int형 포인터 이기 때문입니다. 만약에 double이라면 8byte가 증가하겠죠? 확인해보겠습니다.
▲ 변수와 포인터 모두 자료형만 double로 변경해봤습니다. 그리고 역시 1을 더해봤는데요. 주소가 8byte 증가한 걸 확인할 수 있습니다. 이렇게 포인터 변수를 증가, 또는 감소시키면 그 값에 자료형을 곱한 크기만큼 값이 증가 또는 감소하게 됩니다.
그럼 다음과 같은 연산의 차이점은 뭘까요?
int * b=...;
*(++b)=100;
*(b+1)=100;
■ 두 가지 모두 포인터 변수 b가 가리키고 있는 메모리에서 4byte 증가한 곳에 100을 대입하는 문장입니다. 하지만 연산 후의 b의 값에 변화가 있고 없고의 차이가 있는데요. 첫 번째 (++b)는 연산의 결과로 인해서 b에 저장된 주소 자체가 4byte 증가한 값으로 변경됩니다. 하지만 (b+1)은 b의 값 자체가 바뀌는 게 아니고 4byte 증가한 주소를 이용해서 연산을 진행할 뿐이기 때문에 b의 값이 바뀌지는 않습니다. 참고사항으로 정리해봤구요. 이렇게 해서 포인터 연산의 기본 개념을 정리해봤습니다.