728x90
반응형
2021년 2회 정보처리기사 실기 기출문제
문제
다음 C 프로그램의 실행결과를 쓰시오.
int ary[3];
int s = 0;
*(ary + 0) = 1;
ary[1] = *(ary + 0) + 2;
ary[2] = *ary + 3;
for (int i = 0; i < 3; i++) {
s = s + ary[i];
}
printf("%d", s);
정답
8
반응형
해설
📌 포인터와 배열
- 포인터는 어떤 데이터의 위치(주소)를 가리키는 역할을합니다
- 포인터는 변수의 주소값을 저장하는 변수입니다.
1️⃣ 간접 연산자 *
int *ptr; // ptr은 정수를 가리키는 포인터
- 포인터 변수를 선언할 때는 자료형을 먼저 쓰고 변수명 앞에 *(간접 연산자)를 붙입니다.
- 선언문에서 *는 해당 변수가 포인터 변수임을 나타냅니다.
- 포인터 변수를 통해 주소가 가리키는 값을 참조하거나 변경할 수 있습니다.
2️⃣ 번지 연산자 &
int x = 10;
int *ptr = &x; // &x는 x의 주소
- 변수의 주소를 얻으려면 번지 연산자 &를 사용합니다.
- &x는 변수 x의 메모리 주소를 반환하며, 이를 포인터 변수에 저장할 수 있습니다.
3️⃣ 배열과 포인터의 관계
배열 이름은 배열의 첫 번째 요소의 주소를 가리키며, 포인터처럼 동작합니다. 예: ary는 &ary[0]과 동일한 주소를 나타냅니다.
4️⃣ 포인터 산술 연산
포인터에 정수를 더하면 해당 정수만큼 메모리 단위가 이동합니다. 예: *(ary + 1)은 ary[1]의 값을 참조합니다.
📌 예시 코드
[참고]
%p는 변수의 메모리 주소를 16진수(hexadecimal) 형식으로 출력합니다. 포인터는 메모리 주소를 저장하므로, %p를 사용하면 포인터가 가리키는 메모리의 주소를 확인할 수 있습니다.
1️⃣ 간접 연산자 *
간접 연산자는 포인터가 가리키는 주소의 값을 참조하거나 변경할 때 사용됩니다.
#include <stdio.h>
int main() {
int x = 10;
int *ptr = &x; // ptr은 변수 x의 주소를 저장하는 포인터
printf("x의 값: %d\n", x); // 10
printf("x의 주소: %p\n", &x); // x의 메모리 주소
printf("ptr이 가리키는 값: %d\n", *ptr); // ptr이 가리키는 값 (x의 값)
*ptr = 20; // ptr을 통해 x의 값을 변경
printf("x의 새로운 값: %d\n", x); // 20
출력 결과 :
x의 값: 10
x의 주소: 0x7ffee4a1b6cc (주소는 실행 환경에 따라 다름)
ptr이 가리키는 값: 10
x의 새로운 값: 20
2️⃣ 번지 연산자 &
번지 연산자는 변수의 메모리 주소를 가져오는 연산자입니다.
#include <stdio.h>
int main() {
int a = 42;
int *p = &a; // 변수 a의 주소를 포인터 p에 저장
printf("변수 a의 값: %d\n", a); // 42
printf("변수 a의 주소: %p\n", &a); // 변수 a의 메모리 주소
printf("포인터 p에 저장된 주소: %p\n", p); // p가 가리키는 주소
printf("포인터 p가 가리키는 값: %d\n", *p); // p가 가리키는 값 (a)
return 0;
}
출력 결과 :
변수 a의 값: 42
변수 a의 주소: 0x7ffee4a1b6cc (주소는 실행 환경에 따라 다름)
포인터 p에 저장된 주소: 0x7ffee4a1b6cc
포인터 p가 가리키는 값: 42
3️⃣ 배열과 포인터의 관계
#include <stdio.h>
int main() {
int ary[3] = {1, 2, 3};
printf("ary: %p\n", ary); // 배열의 첫 번째 요소의 주소
printf("&ary[0]: %p\n", &ary[0]); // 첫 번째 요소의 주소 (ary와 동일)
printf("ary[0]: %d\n", ary[0]); // 1
printf("*(ary + 0): %d\n", *(ary + 0)); // 포인터 연산으로 첫 번째 요소 접근 (1)
printf("ary[1]: %d\n", ary[1]); // 2
printf("*(ary + 1): %d\n", *(ary + 1)); // 포인터 연산으로 두 번째 요소 접근 (2)
return 0;
}
출력 결과 :
ary: 0x7ffee4a1b6cc (주소는 실행 환경에 따라 다름)
&ary[0]: 0x7ffee4a1b6cc
ary[0]: 1
*(ary + 0): 1
ary[1]: 2
*(ary + 1): 2
4️⃣ 포인터 산술 연산
#include <stdio.h>
int main() {
int ary[3] = {10, 20, 30}; // 배열 초기화
printf("ary[0]: %d, *(ary + 0): %d\n", ary[0], *(ary + 0)); // ary[0]과 *(ary + 0)은 동일
printf("ary[1]: %d, *(ary + 1): %d\n", ary[1], *(ary + 1)); // ary[1]과 *(ary + 1)은 동일
printf("ary[2]: %d, *(ary + 2): %d\n", ary[2], *(ary + 2)); // ary[2]와 *(ary + 2)은 동일
int *ptr = ary; // 배열의 첫 번째 요소를 가리키는 포인터
printf("ptr이 가리키는 값: %d\n", *ptr); // *(ary + 0)과 동일한 값 (ary[0])
ptr++; // 포인터를 배열의 다음 요소로 이동
printf("ptr이 가리키는 값: %d\n", *ptr); // *(ary + 1)과 동일한 값 (ary[1])
ptr++; // 포인터를 배열의 다음 요소로 이동
printf("ptr이 가리키는 값: %d\n", *ptr); // *(ary + 2)와 동일한 값 (ary[2])
return 0;
}
출력 결과 :
ary[0]: 10, *(ary + 0): 10
ary[1]: 20, *(ary + 1): 20
ary[2]: 30, *(ary + 2): 30
ptr이 가리키는 값: 10
ptr이 가리키는 값: 20
ptr이 가리키는 값: 30
728x90
📌 문제 해설
int ary[3];
int s = 0;
*(ary + 0) = 1; // ary[0] = 1
ary[1] = *(ary + 0) + 2; // ary[1] = ary[0] + 2 = 3
ary[2] = *ary + 3; // ary[2] = ary[0] + 3 = 4
for (int i = 0; i < 3; i++) {
s = s + ary[i]; // 배열의 모든 요소를 더함
}
printf("%d", s); // 결과 출력
- 배열 초기화
- *(ary + 0) = 1을 통해 배열의 첫 번째 요소 ary[0]에 1을 대입합니다.
- 두 번째 요소 계산
- ary[1] = *(ary + 0) + 2는 ary[1] = ary[0] + 2와 동일하며, 값은 3입니다.
- 세 번째 요소 계산
- ary[2] = *ary + 3는 ary[0] + 3과 동일하며, 값은 4입니다.
- 합산 과정
- for 반복문에서 배열의 모든 요소를 더하여 s에 누적합니다.
- 결과 출력
- 배열 요소의 합은 1 + 3 + 4 = 8이며, 이를 출력합니다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."
728x90
반응형
'코딩일기 > 자격증' 카테고리의 다른 글
[정보처리기사] [ C ] 지역변수와 함수 호출 | 정보처리기사 실기 기출문제 (0) | 2025.01.22 |
---|---|
[정보처리기사] [ Python ] for ... in 반복문과 range() 함수 | 시프트 연산 | 정보처리기사 실기 기출문제 (0) | 2025.01.21 |
[정보처리기사] [Java] 상속과 오버라이딩, super 키워드 | 정보처리기사 실기 기출문제 (0) | 2025.01.20 |
[정보처리기사] static 메소드란? 객체 없이 호출하는 방법 | 정보처리기사 실기 기출문제 (0) | 2025.01.20 |
[정보처리기사] 객체지향 분석 방법론 | 정보처리기사 실기 기출문제 (0) | 2025.01.16 |