#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int arr[5] = { 1,2,3,4,5 };
int* ptr = arr;
int i;
for (i = 0; i < 5; i++) {
*ptr += 2;
ptr++;
}
for (i = 0; i < 5; i++)
printf("%d", arr[i]);
return 0;
}
*ptr += 2; ptr++;
후위증가를 하므로, *(ptr++) += 2; 와 같이 한 줄로 대체가능하다.
ptr (arr[0])의 값에 2가 더해진 후,
ptr++ 후위증가에 의해 sizeof(int)=4만큼의 주소값이 더해져서
ptr은 arr[1]를 나타낸다.
for문에 의해 5번 반복한다. 결국 결과는 3,4,5,6,7이 된다.
#include <stdio.h>
int main(void)
{
int arr[5] = { 1,2,3,4,5 };
int* ptr = arr;
int i;
for (i = 0; i < 5; i++) {
*(ptr+i)+= 2;
}
for (i = 0; i < 5; i++)
printf("%d", arr[i]);
return 0;
}
1번 문제는 포인터 변수 ptr에 저장된 값을 변경하면서 배열요소에 접근했다면,
2번 문제는 포인터 변수 ptr에 저장된 값을 변경하지 않으면서, ptr에 더하기를 하여, sizeof(int)=4만큼의 주소값이 더해져서 그 주소의 값에 2를 증가시키는 문제이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int arr[5] = { 1,2,3,4,5 };
int* ptr = &arr[4];
int i, sum=0;
for (i = 0; i < 5; i++) {
sum += *ptr;
*(ptr--);
}
printf("% d", sum);
return 0;
}
풀이는 성공하였지만,
sum += *ptr; *(ptr--);
후위연산을 이용하여
sum += *(ptr--);
이렇게 한 줄로 표현해도 무방하다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int arr[6] = { 1,2,3,4,5,6 };
int n;
int* ptr1 = arr;
int* ptr2 = &arr[5];
int temp=0, i;
for (n = 0; n <= 2; n++) {
temp = *(ptr2-n);
*(ptr2 - n) = *(ptr1 + (5 - n));
*(ptr1+(5-n)) = temp;
}
for (i = 0; i < 6; i++) {
printf("%d ", arr[i]);
}
}
실패했다. 포인터 변수 ptr에 저장된 값을 변경시켜 가면서 배열요소에 접근해야 하는데, 값을 변경시키지 않고, 덧셈과 뺄셈연산을 이용해 배열요소에 접근하는 방식이었기 때문에 최종 결과에는 배열이 달라지지 않았다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int arr[6] = { 1,2,3,4,5,6 };
int n;
int* ptr1 = arr;
int* ptr2 = &arr[5];
int temp = 0, i;
for (n = 0; n <= 2; n++) {
temp = *ptr1;
*(ptr1++) = *ptr2;
*(ptr2--) = temp;
}
for (i = 0; i < 6; i++)
printf("%d ", arr[i]);
}
끈기있게 풀어서 결국 해냈다. 후위증감과 후위감소를 이용하여 답지보다 더 깔끔하게 푼 것 같아 기분이 좋았다.
답지에는 for 문이 아래와 같았다.
temp = *fptr;
*fptr = *bptr;
*bptr = temp;
fptr += 1;
bptr -= 1;
}