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 = #
printf("num = %d\n", num);
printf("p_num = %p\n", p_num);
printf("*p_num = %d\n", *p_num);
return 0;
}
출력예시
1-2. 포인터로 값 변경하기
문제설명
포인터를 이용하여 변수 num의 값을 20에서 50으로 변경하시오.
목표
- *p_num을 통해 원래 변수의 값을 바꿀 수 있음을 이해한다.
요구사항
- num을 20으로 초기화한다.
- p_num이 num을 가리키게 한다.
- *p_num = 50;을 수행한다.
- 변경 전과 후의 num 값을 출력한다.
출력예시
변경 전 num = 20
변경 후 num = 50
코드예시
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
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;
}