-
포인터 연산프로그래밍/C, C++ 2019. 4. 17. 00:00
포인터 연산
포인터 변수가 지원하는 사칙연산은 더하기와 빼기 밖에 안됩니다.
곱하기나 나누기를 쓸 경우, 에러를 발생합니다!#include <stdio.h> int main(){ int a = 10; int *ptr = &a; ptr++; ptr--; // ptr *= 2; Error! //ptr /= 2; Error! }
그리고 더하기, 빼기 연산의 결과는 포인터가 가리키고 있는 변수의 크기 만큼 증가하거나 감소한다!
아래의 예제에서 보면 이해할 수 있을 것이담#include <stdio.h> int main(){ int a = 10; int *ptr = &a; printf("ptr : %x, ptr + 1 : %x\n", ptr, ptr+1); int arr[4] = {1,2,3,4}; int (*ptrArr)[4] = &arr; printf("ptrArr : %x, ptrArr + 1 :%x\n", ptrArr, ptrArr + 1); }
실행결과
ptr : 62fe0c, ptr + 1 : 62fe10 // 차이 : 4
ptrArr : 62fe10, ptrArr + 1 :62fe20 // 차이 : 16
위의 결과를 그림으로 표현하면 아래와 같다ptr이 가리키고 있는건 int 변수입니다. 따라서 int의 크기인 4 바이트만큼 포인터가 증가함을 알 수 있습니다
그 아래 있는 int arr[4]와 int (*ptrArr)[4]의 메모리 구조를 그림으로 보면 아래와 같습니다.
ptrArr 이 가리키고 있는건 int [4]입니다.
따라서 더하기 연산을 할 시, sizeof(int) * 4 인 16바이트만큼 증가함을 볼 수 있습니다.
포인터끼리의 연산
같은 포인터끼리는 연산을 할 수 있습니다. 자료형이 다른 포인터끼리는 연산 시 에러를 발생합니다.
곱하기, 나누기, 더하기는 할 수 없고, 오직 빼기만 사용할 수 있습니다.
연산 결과는 주소간의 차이가 아니라, (주소 차이) / (포인터가 가리키고 있는 변수의 크기)이다#include <stdio.h> int main(){ int a = 10; int *ptr = &a; double d = 10; double *dptr = &d; // printf("%d\n", dptr-ptr); double * 과 int *은 서로 연산 할 수 없다. int arr[4] = {1,2,3,4}; int (*ptrArr)[4] = &arr; // ptrArr은 int [4] 을 가리키는 포인터 int (*ptrArr1)[4] = ptrArr + 3; int (*ptrArr2)[4] = ptrArr - 2; printf("ptrArr1 - ptrArr : %d\n", ptrArr1 - ptrArr); printf("ptrArr2 - ptrArr1 : %d\n", ptrArr2 - ptrArr1); }
실행결과
ptrArr1 - ptrArr : 3 // 주소값이 48바이트 차이난다고 48이 아니라, 48 / 16 = 3
ptrArr2 - ptrArr1 : -5 // -80 / 16 = -5
틀린 부분이나 궁금한 건 댓글 달아주시면 감사하겠습니다 :)
댓글