처음 문제를 접근할 때, 문제를 잘못 읽고 푼 풀이인데, 그런 겸에 포인터 연산에 관한 개념 정리를 해보았다.
#include<stdio.h>
int main(void)
{
int arr[5] = { 1 , 2 , 3 , 4 ,5 };
int* ptr = arr;
printf("첫번째 요소: %d\n", *ptr); ptr++;
printf("두번쨰 요소: %d\n", *ptr); ptr++;
printf("세번째 요소: %d\n", *ptr); ptr++;
printf("네번째 요소: %d\n", *ptr); ptr++;
printf("5번째 요소: %d\n", *ptr); printf("\n");
return 0;
}
이 문장을 통해 *ptr이 배열의 요소값에 접근한다라는 점을 알 수 있다.
그렇다면 밑의 문장도 출력값이 같다고 생각할 수 있지만, 그렇지 않다.
#include<stdio.h>
int main(void)
{
int arr[5] = { 1 , 2 , 3 , 4 ,5 };
int* ptr = arr;
printf("첫번째 요소: %d\n", ptr[0]); ptr++;
printf("두번쨰 요소: %d\n", ptr[1]); ptr++;
printf("세번째 요소: %d\n", ptr[2]); ptr++;
printf("네번째 요소: %d\n", ptr[3]); ptr++;
printf("5번째 요소: %d\n", ptr[4]); printf("\n");
return 0;
}
두 번째 요소의 출력 값이 3 이나 오고 세 번째 요소의 출력 값에 5가 나오며,
나머지 요소들의 출력값에는 쓰레기 값이 출력이 된다.
그 이유는 ptr++에 있는데, 이는 ptr에 저장된 값 자체를 바꾸어준다. 즉 주소 값 자체를 바꾸는 것이다.
배열의 첫번째 요소 값 출력에서 ptr [0] = 1이다. ptr++후 두 번째 요소에서 ptr [0]을 출력한다면, 2가 출력이 된다.
왜 이런 결과 가 나올까?
ptr++연산 후에 ptr의 주소 값자체가 4바이트 증가한 주소 값으로 변경되었고, 이 변경된 주소 값은 원래 배열의 두 번째 요소(ptr [1])의 주소 값이다. 그런데 ptr의 주소 값 자체가 달라졌으므로, 배열의 첫 번째 요소 값의 주소가 두 번째 요소 값의 주소로 변경되어 위와 같은 출력 결과가 나타나게 된 것이다.
13-1의 첫 번째 풀이이다. 출력의 결과는 같지만, 문제에서 요구하는 ptr에 저장된 값을 증가시키는 형태라는 조건을 만족시키지 못했기 때문에 올바르지 않은 풀이이다.
#include<stdio.h>
#define SIZE 5
int main(void)
{
int arr[SIZE] = { 1 , 2 , 3 , 4 ,5 };
int* ptr = arr;
int i = 0;
for (i = 0; i < SIZE; i++)
printf("%d\n", ptr[i] + 2);
return 0;
}
두 번째 정답 풀이
#include<stdio.h>
#define SIZE 5
int main(void)
{
int arr[SIZE] = { 1 , 2 , 3 , 4 ,5 };
int* ptr = arr;
int i = 0;
for (i = 0; i < 5; i++)
{
*ptr += 2;
ptr++;
}
for (i = 0; i < SIZE; i++)
{
printf("%d\n",arr[i]);
}
return 0;
}
반복 문안에서 *ptr += 2;를 하고 ptr++연산을 반복문을 통해 반복해주면서, 배열의 첫 번째 요소 값부터 5번째 요소 값까지 모두 2를 더해 주었다. 문제에서 요구하는 포인터 변수 ptr에 저장된 값(주소 값)을 증가시키는 형태의 연산 또한 ptr++을 통한 연산으로 만족시켜 주었음을 볼 수 있다.
위 코드 블록 안의 *ptr += 2; , ptr++은 *(ptr++) +=2;로 변경해 줄 수 있다.(++가 후위 증가, 이문장의 +=연산을 먼저 진행한 후에, ptr에 저장된 값이 증가한다.)