코딩일기/자격증

[정보처리기사] [ C ] 포인터와 배열 | 정보처리기사 실기 기출문제

jhy_2023 2025. 1. 21. 12:45
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
반응형