728x90
반응형

2021년 3회 정보처리기사 실기 기출문제
문제
다음 C언어 프로그램을 분석하여 실행 결과를 쓰시오.
#include <stdio.h>
int main(){
int *arr[3];
int a = 12, b = 24, c = 36;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
printf("%d\n", *arr[1] + **arr + 1);
}
정답
37
해설
📌 기본 개념
C언어에서 포인터는 변수의 메모리 주소를 저장하는 변수입니다.
포인터 배열은 포인터를 원소로 가지는 배열을 의미합니다.
1️⃣ 간접 연산자 *와 번지 연산자 &
🔹 포인터 변수 선언
자료형 *포인터변수;
int *p; // 정수형(int) 변수를 가리키는 포인터 변수 p 선언
- 포인터 변수는 어떤 변수의 주소를 저장하는 변수를 의미하며, 선언할 때 *(간접 연산자)를 사용함.
- 포인터 변수를 선언할 때는 자료형을 먼저 쓰고 변수명 앞에 간접 연산자 *을 붙입니다. 선언문에서 간접 연산자 *은 포인터 변수임을 나타냅니다.
- int* p;, int *p;, int * p; 모두 같은 의미 (하지만 int *p;처럼 사용하는 것이 일반적)
🔹 포인터 배열 선언
자료형 *배열이름[배열 크기];
int *arr[3]; // 정수형 변수의 주소를 저장하는 포인터 3개를 갖는 배열 arr 선언
- 위 선언은 arr이 정수형 변수의 주소를 저장하는 포인터 배열이라는 것을 의미합니다.
- 각 요소(arr[0], arr[1], arr[2])는 정수를 가리키는 포인터
🔹 번지 연산자 &와 실행문에서의 간접 연산자 *
int x = 10;
int *ptr = &x; // &x는 x의 주소
- 포인터 변수에 주소를 저장하기 위해 변수의 주소를 알아낼 때는 변수 앞에 번지 연산자 &를 붙입니다.
- 번지 연산자&는 변수의 주소를 가져오는 연산자입니다
int x = 10;
int *ptr = &x; // ptr은 x의 주소를 가짐
printf("%d", *ptr); // *ptr은 x의 값을 출력 (10)
- 실행문에서 간접 연산자 *은 포인터가 가리키는 주소의 값(해당 포인터가 가리키는 원래 값)을 나타냅니다.
🔎 예제 : 간접 연산자 *와 번지 연산자 &
#include <stdio.h>
int main() {
int x = 7;
int *y = &x;
printf("x의 값 = %d\n", x);
printf("y의 값 = %p\n", y);
return 0;
}
// 출력
x의 값 = 7
y의 값 = 0x7ffeefbff5a4 // 메모리 주소는 실행할 때마다 다를 수 있음
- x는 정수형 변수이며, 값은 7입니다.
- y는 x의 주소를 저장하는 포인터입니다. y는 x의 주소를 저장하고 있으므로, 실행할 때마다 달라지는 메모리 주소가 출력됩니다.
🔎 예제 : 실행문에서 간접 연산자 *
#include <stdio.h>
int main(){
int x = 5;
double xd = 5.5;
int *y = &x;
double *yd = &xd;
printf("y가 가리키는 원래 값 = %d\n", *y);
printf("y의 값 = %p\n", y);
printf("yd가 가리키는 원래 값 = %.1f\n", *yd);
printf("yd의 값 = %p\n", yd);
}
- x는 정수형 변수로 5를 저장. xd는 실수형 변수로 5.5를 저장
- y는 x의 주소를 저장하는 포인터. yd는 xd의 주소를 저장하는 포인터
- *y는 x의 값인 5를 출력. y는 x의 주소를 출력 (주소는 실행할 때마다 달라짐)
- *yd는 xd의 값인 5.5를 출력. yd는 xd의 주소를 출력 (주소는 실행할 때마다 달라짐)
- 포인터를 사용하면 변수의 주소를 저장하고, * 연산자로 해당 값을 접근할 수 있음을 보여주는 예시이다.
2️⃣ 배열 이름은 배열 첫 번째 요소의 주소를 가리키는 포인터
int arr[5] = {10, 20, 30, 40, 50};
printf("%p\n", arr); // arr은 arr[0]의 주소
printf("%p\n", &arr[0]); // arr[0]의 주소
- %p는 변수의 메모리 주소를 16진수(hexadecimal) 형식으로 출력합니다. 포인터는 메모리 주소를 저장하므로, %p를 사용하면 포인터가 가리키는 메모리의 주소를 확인할 수 있습니다.
- 배열 이름 arr은 배열의 첫 번째 요소 arr[0]의 주소를 의미합니다.
- 위의 두 출력값은 동일합니다.
반응형
📌 문제 코드 해설
#include <stdio.h>
int main() {
int *arr[3];
int a = 12, b = 24, c = 36;
arr[0] = &a;
arr[1] = &b;
arr[2] = &c;
printf("%d\n", *arr[1] + **arr + 1);
}
이 코드는 포인터 배열을 활용하여 변수 a, b, c의 주소를 배열 요소로 저장하고, 포인터를 통해 값을 참조하여 연산합니다.
변수와 포인터 배열이 메모리에 어떻게 저장되는지 표로 정리하면 다음과 같습니다.
1️⃣ 메모리 상태
🔹 변수의 메모리 상태

🔹 포인터 배열 arr 의 메모리 상태

arr은 포인터 배열이므로, 각 요소는 변수 a, b, c의 주소를 저장하고 있습니다. 즉, arr[0]에는 a의 주소(10번지), arr[1]에는 b의 주소(20번지), arr[2]에는 c의 주소(30번지)가 저장됩니다.
728x90
2️⃣ 식 분석
printf("%d\n", *arr[1] + **arr + 1);
*arr[1] + **arr + 1
= 24 + 12 + 1
= 37
- *arr[1]
- arr[1]에는 b의 주소(20번지)가 저장되어 있음.
- 실행문에서 간접 연산자 *은 포인터가 가리키는 주소의 값(해당 포인터가 가리키는 원래 값) = 20번지의 값 = 24
- 즉,*arr[1]은 b의 값을 의미하므로 24.
- **arr
- 배열 이름은 배열 첫 번째 요소의 주소를 가리키는 포인터 = 10번지
- arr[0]에는 a의 주소(10번지)가 저장되어 있음.
- 실행문에서 간접 연산자 *은 포인터가 가리키는 주소의 값(해당 포인터가 가리키는 원래 값) = 10번지의 값 = 12
- 따라서 *arr[0]은 a의 값. 즉, **arr = 12.
- **arr + 1
- **arr이 12이므로, **arr + 1은 12 + 1 = 13.
- 위와 같은 과정을 거쳐 printf("%d\n", *arr[1] + **arr + 1);의 결과는 37이 출력됩니다.
3️⃣ 요약
*arr[n]
- arr[n] : arr[n]이 가리키는 값
**arr
- **arr : arr[0]이 가리키는 값
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
728x90
반응형
'코딩일기 > 자격증' 카테고리의 다른 글
[정보처리기사] [Java] static 변수와 메서드 이해 | 싱글톤 패턴 활용 | 정보처리기사 실기 기출문제(2021년 3회) (0) | 2025.03.23 |
---|---|
[정보처리기사] [Java] 논리 연산자를 활용한 조건문 분석 | 연산자 우선순위 | 정보처리기사 실기 기출문제 (0) | 2025.03.23 |
[정보처리기사] [ C ] 구조체 포인터와 배열 | 정보처리기사 실기 기출문제 (0) | 2025.03.10 |
[정보처리기사] [ Python ] 비교 연산자 ==| 파이썬 vs C vs Java 참/거짓 출력 차이 | 정보처리기사 실기 기출문제 (0) | 2025.03.04 |
[정보처리기사] SQL | CROSS JOIN과 LIKE 연산자 활용 | 정보처리기사 실기 기출문제 (0) | 2025.02.25 |