본문 바로가기

programming language/C 언어

열혈 c 프로그래밍 문제 13-1(1)

처음 문제를 접근할 때, 문제를 잘못 읽고 푼 풀이인데, 그런 겸에 포인터 연산에 관한 개념 정리를 해보았다.

#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에 저장된 값이 증가한다.)