윤성우의 열혈 C 프로그래밍 - 포인터를 이용한 배열의 접근[13-1]

Yumin Jung·2023년 7월 20일
0

13-1-1

#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이 된다.

13-1-2

#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를 증가시키는 문제이다.

13-1-3

#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--);

이렇게 한 줄로 표현해도 무방하다.

13-1-4

#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;
}
profile
문과를 정말로 존중해

0개의 댓글