← 목록으로

📋 컴퓨터 프로그래밍 기능사 단골 기출 (포인터)

기능사 시험에 자주 나오는 포인터 유형을 모았어요. 5단계 강의를 본 뒤 풀어 보세요.

1. 주소와 값 출력 (기본)

다음 프로그램의 출력 결과는?

#include <stdio.h>
int main() {
    int a = 10, b = 20;
    int *p = &a;
    printf("%d ", *p);
    p = &b;
    printf("%d", *p);
    return 0;
}

10 20

해설: p가 먼저 a를 가리키므로 *p는 10. 그다음 p = &b로 b를 가리키므로 *p는 20.

2. 문자열 포인터 – %s, %c (단골)

다음 프로그램의 출력 결과는?

#include <stdio.h>
int main() {
    char *p = "KOREA";
    printf("%s\n", p);
    printf("%s\n", p + 3);
    printf("%c\n", *p);
    printf("%c\n", *(p + 3));
    printf("%c\n", *p + 2);
    return 0;
}

KOREA EA K E M

해설: %s는 주소부터 널문자 전까지 출력. p+3은 "EA"부터. *p는 'K', *(p+3)은 'E'. *p+2는 'K'(ASCII 75)+2 = 77 = 'M'.

📌 유사문제 (문자열 포인터)

char *q = "ABC"; 일 때 printf("%c", *(q+1)); printf("%c", *q+1); 의 출력은?

B B

*(q+1)은 두 번째 문자 'B'. *q+1은 'A'(65)+1 = 66 = 'B'.

3. 배열과 포인터 (포인터로 배열 접근)

다음 프로그램의 출력 결과는?

#include <stdio.h>
int main() {
    int a[] = { 10, 20, 30 };
    int *p = a;
    printf("%d ", *p);
    printf("%d ", *(p + 1));
    printf("%d", *(p + 2));
    return 0;
}

10 20 30

해설: 배열 이름 a는 첫 번째 요소의 주소. p가 a를 가리키므로 *p는 a[0], *(p+1)은 a[1], *(p+2)는 a[2].

4. 포인터로 값 바꾸기

다음 프로그램의 출력 결과는?

#include <stdio.h>
int main() {
    int x = 5, y = 10;
    int *p = &x;
    *p = *p + 5;
    printf("%d %d", x, y);
    return 0;
}

10 10

해설: p가 x를 가리키므로 *p = *p + 5는 x의 값을 5만큼 더함. x는 10이 되고, y는 그대로 10.

5. 배열 + 포인터 연산 (합·차 계산)

다음 프로그램의 출력 결과는?

#include <stdio.h>
int main() {
    int a[4] = { 1, 2, 3, 4 };
    int *p = a;
    int sum = 0;
    for (int i = 0; i < 4; i++)
        sum += *(p + i);
    printf("%d", sum);
    return 0;
}

10

해설: *(p+0)~*(p+3)은 a[0]~a[3]과 같음. 1+2+3+4 = 10.

📌 유사문제 (배열·포인터 합)

int b[] = { 2, 4, 6 }; int *p = b; printf("%d", *p + *(p+1) + *(p+2)); 의 출력은?

12

*p=2, *(p+1)=4, *(p+2)=6 → 2+4+6 = 12.

6. 구조체 포인터 (→ 화살표)

다음 프로그램의 출력 결과는? (기능사에서 가끔 출제)

#include <stdio.h>
struct Data { int n; };
int main() {
    struct Data d = { 100 };
    struct Data *p = &d;
    printf("%d", p->n);
    return 0;
}

100

해설: 포인터 p가 구조체를 가리킬 때 멤버 접근은 p->n. p가 가리키는 구조체의 n 값이 100.

📌 유사문제 (구조체 포인터)

struct T { int x; }; struct T v = { 50 }; struct T *r = &v; printf("%d", r->x + 10); 의 출력은?

60

r->x는 50이므로 50+10 = 60.

🔬 심화학습

기능사 한 단계 위 난이도. 포인터 연산·함수 인자·포인터 증감을 다룹니다.

[심화 1] p++, *p++ 의 차이 – 다음 출력은?

#include <stdio.h>
int main() {
    int a[] = { 10, 20, 30 };
    int *p = a;
    printf("%d ", *p++);
    printf("%d ", *p);
    return 0;
}

10 20

해설: *p++는 "현재 *p를 먼저 쓰고, 그다음 p를 1 증가". 그래서 10 출력 후 p가 a+1을 가리켜 다음 *p는 20.

[심화 2] 함수에 포인터 넘기기 – 다음 출력은?

#include <stdio.h>
void add(int *p) { *p = *p + 10; }
int main() {
    int n = 5;
    add(&n);
    printf("%d", n);
    return 0;
}

15

해설: add(&n)으로 n의 주소를 넘기면 함수 안에서 *p로 n이 있는 방을 바꿈. n = 5+10 = 15.

[심화 3] 두 포인터로 스왑 – 다음 출력은?

#include <stdio.h>
int main() {
    int x = 3, y = 7;
    int *p = &x, *q = &y;
    int t = *p; *p = *q; *q = t;
    printf("%d %d", x, y);
    return 0;
}

7 3

해설: *p와 *q(즉 x와 y)의 값을 임시 변수 t로 바꿔 넣음. x와 y가 서로 바뀜.

💡 보강 – 자주 틀리는 것 & 시험 팁

✓ 시험 전 체크

  • *p = 값, p = 주소, &a = a의 주소
  • *p+2는 (*p)+2 (값에 2 더함, ASCII에서 자주 나옴). *(p+2)는 p에서 2칸 뒤의 값.
  • 문자열: %s는 (주소부터) 문자열, %c는 한 문자. *(p+i)는 i번째 문자.
  • 구조체: 변수는 d.n, 포인터는 p->n (화살표 한 번만).
자주 틀리는 것 1: *p+1과 *(p+1)을 혼동. 전자는 "가리키는 값+1", 후자는 "다음 칸의 값".
자주 틀리는 것 2: printf("%s", *p);처럼 %s에 *p를 넣으면 안 됨. %s에는 주소(p)를 넣어야 함.
자주 틀리는 것 3: 구조체 포인터에서 p.n이라고 쓰면 오류. 반드시 p->n.

정리

← 목록으로