1-1. 포인터가 가리키는 값 읽기

문제설명
정수 변수 num과 포인터 변수 p_num이 있다. p_num이 num을 가리키도록 한 뒤, num, p_num, *p_num을 출력하는 코드이다. printf문에서 출력될 결과가 왜 그렇게 되는지를 설명하시오. 

 

목표

  • &와 *의 의미를 이해한다.
  • p_num == # 와  *p_num == num 관계를 이해한다.

요구사항

  • num을 10으로 초기화한다.
  • p_num이 num을 가리키도록 한다.
  • 아래 값을 출력한다.
    • num
    • p_num
    • *p_num

코드

#include <stdio.h>

int main(void)
{
    int num = 10;
    int *p_num = &num;

    printf("num = %d\n", num);
    printf("p_num = %p\n", p_num);
    printf("*p_num = %d\n", *p_num);

    return 0;
}
 

 

출력예시

더보기
더보기
num = 10
p_num = 0x61ff1c
*p_num = 10
 

 

1-2. 포인터로 값 변경하기

 

문제설명
포인터를 이용하여 변수 num의 값을 20에서 50으로 변경하시오.

 

목표

  • *p_num을 통해 원래 변수의 값을 바꿀 수 있음을 이해한다.

요구사항

  • num을 20으로 초기화한다.
  • p_num이 num을 가리키게 한다.
  • *p_num = 50;을 수행한다.
  • 변경 전과 후의 num 값을 출력한다.

출력예시

변경 전 num = 20
변경 후 num = 50
 
 
코드예시
더보기
더보기
#include <stdio.h>

int main(void)
{
    int num = 20;
    int *p_num = &num;

    printf("변경 전 num = %d\n", num);

    *p_num = 50;

    printf("변경 후 num = %d\n", num);

    return 0;
}​
 

1-3. (*p_num)++ 와 p_num++ 차이

 

문제설명
(*p_num)++ 와 p_num++ 의 차이를 확인하는 프로그램을 작성하고 그 차이를 설명하시오. 

 

목표

  • (*p_num)++ 는 가리키는 값을 증가시키고,
  • p_num++ 는 포인터가 다음 주소를 가리키게 함을 이해한다.

요구사항

  • 배열 arr[3] = {10, 20, 30} 을 선언한다.
  • p_num이 arr[0]을 가리키도록 한다.
  • 먼저 (*p_num)++ 를 수행한 뒤 값을 출력한다.
  • 이후 p_num++ 를 수행한 뒤 *p_num을 출력한다.
 

출력예시

처음 *p_num = 10
(*p_num)++ 후 *p_num = 11
p_num++ 후 *p_num = 20
 

코드예시

더보기
더보기
#include <stdio.h>

int main(void)
{
    int arr[3] = {10, 20, 30};
    int *p_num = arr;

    printf("처음 *p_num = %d\n", *p_num);

    (*p_num)++;
    printf("(*p_num)++ 후 *p_num = %d\n", *p_num);

    p_num++;
    printf("p_num++ 후 *p_num = %d\n", *p_num);

    return 0;
}

 

2-1. NULL 포인터 검사

 

문제설명
포인터가 아무 곳도 가리키지 않을 때 NULL로 초기화하고, 사용 전에 검사하는 프로그램을 작성하시오.

 

목표

  • NULL 포인터의 의미를 이해한다.
  • 포인터를 사용하기 전에 NULL인지 검사해야 함을 이해한다.

요구사항

  • int *p_num = NULL; 로 초기화한다.
  • if (p_num == NULL) 조건으로 검사한다.
  • "포인터가 아무 것도 가리키지 않습니다." 를 출력한다.

출력예시

포인터가 아무 것도 가리키지 않습니다.
 
코드예시 
더보기
더보기
#include <stdio.h>

int main(void)
{
    int *p_num = NULL;

    if (p_num == NULL)
    {
        printf("포인터가 아무 것도 가리키지 않습니다.\n");
    }

    return 0;
}

 

2-2. 어떤 변수의 주소를 가리키는가?

문제설명
포인터가 다른 변수의 주소를 가리키도록 바꾸면서 값을 출력하시오.

 

목표

  • 포인터 변수의 값(주소)을 바꾸면 다른 변수를 가리킬 수 있음을 이해한다.

요구사항

  • num1 = 100, num2 = 200 으로 초기화한다.
  • p_num이 먼저 num1을 가리키게 한다.
  • *p_num += 10;
  • 이후 p_num = &num2;
  • *p_num += 10;
  • 마지막에 num1, num2를 출력한다.
출력예시
num1 = 110
num2 = 210

 

 

코드예시 

더보기
더보기
#include <stdio.h>

int main(void)
{
    int num1 = 100;
    int num2 = 200;
    int *p_num;

    p_num = &num1;
    *p_num += 10;

    p_num = &num2;
    *p_num += 10;

    printf("num1 = %d\n", num1);
    printf("num2 = %d\n", num2);

    return 0;
}

 

2-3. 아래 코드의 출력 결과를 쓰시오

 

문제설명
다음 코드를 읽고 출력 결과를 예측하시오.

 

목표

  • 포인터가 어떤 변수를 가리키는지 추적하는 연습을 한다.

코드

#include <stdio.h>

int main(void)
{
    int num1 = 3;
    int num2 = 7;

    int *p_num = &num1;

    *p_num += 2;
    p_num = &num2;
    *p_num *= 3;

    printf("%d %d\n", num1, num2);

    return 0;
}
 

출력


3-1. 포인터를 이용한 값 교환

문제설명
두 정수의 값을 포인터를 이용하여 교환하는 프로그램을 작성하시오.

 

목표

  • 포인터를 함수 매개변수로 사용할 수 있음을 이해한다.
  • 함수 안에서 원래 변수의 값을 바꿀 수 있음을 이해한다.

요구사항

  • swap 함수를 작성한다.
  • 함수의 매개변수는 int *a_ptr, int *b_ptr 로 한다.
  • 두 값의 내용을 교환한다.

 

 

출력예시

교환 전: 10 20
교환 후: 20 10
 

코드예시

더보기
더보기
#include <stdio.h>

void swap(int *a_ptr, int *b_ptr)
{
    int temp = *a_ptr;
    *a_ptr = *b_ptr;
    *b_ptr = temp;
}

int main(void)
{
    int num1 = 10;
    int num2 = 20;

    printf("교환 전: %d %d\n", num1, num2);

    swap(&num1, &num2);

    printf("교환 후: %d %d\n", num1, num2);

    return 0;
}

 

3-2. 배열과 포인터 이동

 

문제설명
배열을 포인터로 순회하며 모든 값을 출력하시오.

 

목표

  • 배열 이름은 첫 번째 원소의 주소임을 이해한다.
  • p_num++ 가 다음 원소를 가리키게 함을 이해한다.

요구사항

  • scores[5] = {80, 90, 70, 100, 85} 를 선언한다.
  • p_num = scores;
  • 반복문을 이용하여 모든 값을 출력한다.
출력예시
80 90 70 100 85
 
코드예시 
더보기
더보기
#include <stdio.h>

int main(void)
{
    int scores[5] = {80, 90, 70, 100, 85};
    int *p_num = scores;

    for (int i = 0; i < 5; i++)
    {
        printf("%d ", *p_num);
        p_num++;
    }

    return 0;
}​

 

3-3. 포인터 연산 추적하기

 

문제설명
다음 코드의 출력 결과를 쓰시오.

 

목표

  • 포인터 이동과 역참조의 순서를 이해한다.
출력예시
5
10
11
15
 

 

코드예시
#include <stdio.h>

int main(void)
{
    int arr[4] = {5, 10, 15, 20};
    int *p_num = arr;

    printf("%d\n", *p_num);

    p_num++;
    printf("%d\n", *p_num);

    (*p_num)++;
    printf("%d\n", *p_num);

    p_num++;
    printf("%d\n", *p_num);

    return 0;
}​

 

+ Recent posts