배열의 앞과 뒤를 가리키는 포인터 변수 2개를 선언해서 이를 활용해 저장된 값의 순서를 6 5 4 3 2 1로 바꾸어 출력하는 문제이다. 처음 풀이인데 문제도 잘못 읽었고, 문제 해결도 엉망인 문장들이다.
#include<stdio.h>
int main(void)
{
int arr[6] = { 1,2,3,4,5,6 };
int* front = arr;
int* back = &arr[5];
*front = arr[0];
arr[0] = *back;
*back = *front;
*(front + 1) = arr[1];
arr[1] = *(back - 1);
*(back - 1) = *(front - 1);
*(front + 2) = arr[2];
arr[2] = *(back - 2);
*(back - 2) = *(front + 2);
printf("%d", arr);
return 0;
}
arr을 출력하는 것조차 틀림. arr은 arr의 주소 값을 뜻하기 때문에, 배열 요소의 값을 출력하고 싶다면, arr [i]의 형식으로 코드를 입력했어야 했다.
9~11행을 보면, 9행은 *front의 값이 원래 arr[0]이기 때문에 아무 의미가 없는 문장이고,
10행에서 arr[0]<--*back의 값인 6이 대입이 되는 문장이다.
11행은 그럼 *back의 값에 배열의 첫 번째 요소인 arr [0] = 1의 값이 들어올까? 아니다. 앞에 10행에서 arr[0]의 값이 6으로 대체되었고 그에 따라 *front는 배열의 첫 번째 요소의 값을 가리키는데, 이 첫 번째 요소의 값이 6으로 변경되었으므로, *back = 6;과 같은 문장이 되는 것이다.
만약 위 9-11행을 이와 같이 바꿔 준다면
9행*front = arr[0];
10행arr[1] = *back;
11행*back = *front;
출력값: 163451
출력 값은 163451이 나온다. 그러므로 10행에서 *back의 값이 배열 요소의 값에 대체되어 들어간다는 것을 증명할 수 있다. 그리고 11행에서 *front는 첫 번째 요소의 값을 가리키고 이 요소의 값이 변경되지 않았기 때문에 6번째 배열 요소 값을 1로 변경할 수 있었다.
이를 통해 위의 코드 블록에서의 코드들이 왜 옳지 않은지 알 수 있을 것이다. (물론, 의미 없는 실수들도 있다.)
<문제의 올바른 풀이>
과거 영단어 뒤집어 출력하기에서 이와 같은 방법을 사용하였던 적이 있어, 처음 문제를 풀려할 때, 이 방법을 떠올렸지만, 문제를 잘못 읽은 관계로 나중에서야 풀이를 보고 내가 문제를 잘못 읽었구나라고 깨달았다.
#include<stdio.h>
int main(void)
{
int arr[6] = { 1,2,3,4,5,6 };
int* front = arr;
int* back = &arr[5];
int i,temp = 0;
for (i = 0; i < 3; i++)
{
temp = *(front + i);
*(front + i) = *(back - i);
*(back - i) = temp;
}
for(i=0;i<6;i++)
printf("%d", arr[i]);
return 0;
}
temp는 정수형 변수이고, 12-14행을 보면 우선 12행에서 temp값에 우변에 있는 *front값을 임시적으로 저장한다라고 생각할 수 있고, 13행에서 이 *front값에 *back값을 대체하여 넣어준다 생각할 수있고, 14행에서 *back값에 아까 임시적으로 저장해 두었던 temp값을 대입하여 준다라고 생각하면 편할 것이다.
그리고 꼭 위와 같은 이해가 아니더라도, 좌변에 있는 값이 우변에 있는 값으로 대체된다라고 생각하면 될 것 같다.