서론
이번 포스팅에서는 정보처리기사 프로그래밍 문제를 풀 때 매번 헷갈리게 하는 포인터 문제를 풀어보고자 한다. 이번 포스팅 역시 문제 코드를 적을텐데 출력 값을 미리 풀어보고, 밑에 풀이를 보는 걸 추천한다. 정답은 포스팅 맨 아래에 있다. 이걸 맞춘다면 당신은 포인터 마스터. 지난 포스팅을 보려면 여기로 가면 된다.
#include <stdio.h>
int main()
{
int arr[5] = {10, 20, 30, 40, 50};
int *ptr;
ptr = arr;
printf("no.1 %d\n", ++*ptr);
printf("no.2 %d\n", *(arr+1));
printf("no.3 %d\n", *ptr++);
printf("no.4 %d\n", ++*ptr);
printf("no.5 %d\n", *arr+1);
printf("no.6 %d\n", *ptr++);
printf("no.7 %d\n", *ptr+1); }
문제 풀이
첫번째는 ++*ptr이다. 그렇기에 *ptr이 가리키는 값에 더한 값인 11을 출력한다. 두번째는 arr + 1에 괄호가 쳐져 있다. 그러므로, arr에서 하나 더 옮겨져 있는 것인 20 출력하면 된다. 그 다음 세번째 *ptr++이다. 첫번째에 할 때 ptr의 값을 11로 바꿨다.(ptr 위치를 옮긴적은 없음). 그렇기에 *ptr은 11이고, 출력까지 11을 한다. 하지만 ptr++이기에 앞에 출력 후 오른쪽으로 옮겨야 된다. ptr은 이제 20을 가리킨다. 중간 점검을 하자면, no.3까지 진행했을 때 arr의 값은 {11, 20, 30, 40, 50}이고 ptr은 20을 가리키고 있는 것이다.
이제 네번째 출력문을 해보자. ptr은 20을 가리키고 있다. 그런데 *ptr 값에다가 ++를 하라니까 21이 된다. 다섯번째 출력문은, *ptr+1이 아니라 *arr+1이다. arr의 첫번째 인덱스 값에 1을 더한 12가 된다. 현재 ptr은 21이다. 그래서 일단 여섯번째는 21을 출력하지만, 이제 ptr이 가리키는건 30이 된다. 마지막으로 *ptr+1을 하라니, 31을 출력하면 끝이 난다. 최종적으로 답은 아래와 같다.
no.1 11
no.2 20
no.3 11
no.4 21
no.5 12
no.6 21
no.7 31
끝으로
위에서 후루룩 풀었지만 포인터의 헷갈리는 포인트를 하나 꼽자면 *ptr++은 위치를 이동하라는 거라는 것을 알아야 된다. 세번째와 여섯번째 출력 때를 보면 일단 ptr이 가리키는걸 출력하고 그 위치를 옆으로 옮긴 걸 볼 수 있다. 이상으로 포인터 관련 문제를 마치겠다. 어쩌면 근시일내에 다른 포인터 문제로 돌아올수도있음.
'IT, Computer' 카테고리의 다른 글
[정보처리기사] 프로그래밍 언어 기출 풀이 (5) JAVA equal, == 차이 (0) | 2025.04.11 |
---|---|
티스토리 hELLO 스킨 적용 방법 (0) | 2025.04.10 |
[정보처리기사] 프로그래밍 언어 문제 풀이 (4) - JAVA 싱글턴 패턴 (0) | 2025.04.09 |
[정보처리기사] 프로그래밍 언어 문제 풀이 (3) - 딕셔너리 (0) | 2025.04.08 |
[정보처리기사] 프로그래밍 언어 문제 풀이 (2) - 정적 변수 (0) | 2025.04.07 |