#include <stdio.h> int main() { int numArr[5] = { 11, 22, 33, 44, 55 }; void *ptr = &numArr[2]; // 두 번째 요소의 메모리 주소 printf("%d\n", *(int *)ptr); // 33: 포인터 연산을 하지 않은 상태에서 역참조 // void 포인터를 다른 포인터로 변환하여 포인터 연산을 한 뒤 역참조 printf("%d\n", *((int *)ptr + 1)); // 44 printf("%d\n", *((int *)ptr - 1)); // 22 printf("%d\n", *(++(int *)ptr)); // 44 ====> (0)번 printf("%d\n", *(--(int *)ptr)); // 33 ====> (1)번 printf("%d\n", *(((int *)ptr)++)); // 33 ====> (2)번 printf("%d\n", *(((int *)ptr)--)); // 44 ====> (3)번 return 0; }(0)번에서 numArr[2]의 전위연산 ++의 결과로 44가 나옵니다.
(1)번에서 44를 현재 ptr이 가르키고 있기때문에 --에 의해 numArr[3-1]이 되어 도로 numArr[2]가 되어 값이 33나왔습니다.
(2)번에서 현재 33을 ptr이 가르키고 있지만 후위 연산 ++으로 인하여 먼저 할당되어져서 결과값이 33이 나오고 후위 ++ 되어 numArr[3]=44는 지금 (3)번의 ptr이 가르키고 있는중입니다.
(3)번에서 후위 --이므로 먼저 numArr[3] = 44를 먼저 할당받아 역참조한 값이 44를 출혁한후 후위 -- 를 계산한값 33은 출력이 되지 않습니다.
위내용이 제가 이해하는 내용인데 맞는것인지 확실치가 않아서 선생님께 질문드립니다.
네 그럼 의문이 한가지 더 생깁니다
0번 위의 두줄말씀인데요
printf("%d\n", *((int *)ptr + 1)); // 44 printf("%d\n", *((int *)ptr - 1)); // 22위 두줄부분은 왜 ptr이 독립적으로 할당이 되어지는것인지가
또 궁금해지는 사항입니다.
*((int*)ptr +1)); <-- 여기서부터 44가 되어서 계속 밑에줄까지 연달아 계산하면 다른 결과값이 나올텐데요
실제로 실행하면 본문데로 실행되지않습니까?
위 두줄은 할당하는것이 아닌 연산이라 독립적으로 ptr이 가르킬수 있는것이고 밑에줄부터는 증감연산으로 인하여 할당되어져서 값을 유지한채 다음 연산의 결과를 출력하게 되는것이다. <---- 제가 이해하고 있는부분입니다 바르게 이해한것이 맞는지요?
printf("%d\n", *((int *)ptr + 1)); // 44 printf("%d\n", *((int *)ptr - 1)); // 22질문의 의도를 정확하게 이해한 것인지 모르겠습니다만, ptr에는 어떤 변경도 발생하지 않습니다.
int numArr[5] = { 11, 22, 33, 44, 55 }; void *ptr = &numArr[2];ptr은 여전히 numArr[2]를 가리키고 있습니다.
void 포인터는 연산을 할 수 없으니 다른 포인터로 바꾼 후에 연산을 합니다. 여기서는 (int *)로 변환하고 포인터 연산을 합니다.
(int*)ptr + 1은 ptr이 가리키는 것에서 + 1한 위치가 되므로 이를 역참조하면 44가 됩니다. 여기서도 ptr이 가리키는 위치는 변하지 않습니다.
그러니 다음에 (int*)ptr -1을 역참조한 결과는 22가 되지만, ptr은 여전히 numArr[2]를 가리킵니다.
나머지 전위연산자와 후위연산자는 ptr 자체의 값을 바꿉니다.