코딩일기/자격증

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

jhy_2023 2024. 12. 10. 22:43
728x90
반응형

문제

다음은 C언어로 작성된 프로그램이다. 이를 실행한 출력 결과를 쓰시오.

#include <stdio.h>

void main() {
    char *p = "KOREA";     
    printf("%s\n", p);  
    printf("%s\n", p + 3);
    printf("%c\n", *p);
    printf("%c\n", *(p + 3));
    printf("%c\n", *p + 2);
}

정답

KOREA
EA
K
E
M


반응형

해설

📌 포인터와 포인터 변수

  • 포인터는 어떤 데이터의 위치(주소)를 가리키는 역할 합니다.
  • 포인터 변수는 다른 변수나 데이터가 저장된 메모리 주소를 저장하는 변수입니다.
  • C언어에서 변수의 주소를 저장할 때 사용하는 변수를 포인터 변수라 합니다.

1️⃣  간접 연산자 *

int *ptr;  // ptr은 정수를 가리키는 포인터
  • 포인터 변수를 선언할 때는 자료형을 먼저 쓰고 변수명 앞에 간접 연산자 *을 붙입니다.
  • 선언문에서 간접 연산자 * 포인터 변수임을 나타냅니다.
int x = 10;
int *ptr = &x;  // ptr은 x의 주소를 가짐
printf("%d", *ptr);  // *ptr은 x의 값을 출력 (10)
  • 실행문에서 포인터 변수에 간접 연산자 *을 붙이면 해당 포인터 변수가 가리키는 곳의 을 말합니다.
  • 실행문에서 간접 연산자 * 포인터가 가리키는 주소의 값을 나타냅니다

2️⃣  번지 연산자 &

int x = 10;
int *ptr = &x;  // &x는 x의 주소
  • 포인터 변수에 주소를 저장하기 위해 변수의 주소를 알아낼 때는 변수 앞에 번지 연산자 &를 붙입니다.
  • 번지 연산자& 변수의 주소를 가져오는 연산자입니다

📌 포인터와 배열

1️⃣  배열 이름은 배열 첫 번째 요소의 주소를 가리키는 포인터

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]의 주소를 의미합니다.
  • 위의 두 출력값은 동일합니다.

2️⃣ 포인터를 통해 배열 요소 접근

int arr[5] = {10, 20, 30, 40, 50};
printf("%d\n", *(arr + 0)); // arr[0] 값 출력 (10)
printf("%d\n", *(arr + 1)); // arr[1] 값 출력 (20)

배열 이름을 포인터처럼 사용하여 배열 요소에 접근할 수 있습니다.

  • arr + n은 배열의 n번째 요소의 주소를 나타냅니다.
  • 실행문에서 간접 연산자 *이 사용되었으니 *(arr + n)은 그 주소에 저장된 값을 가져옵니다. arr + n은 배열의 n번째 요소의 주소를 나타냅니다.

3️⃣ 포인터 변수로 배열 접근

int arr[5] = {10, 20, 30, 40, 50};
int *p = arr; // arr의 주소를 포인터 변수 p에 저장
printf("%d\n", *p);     // arr[0] 값 출력 (10)
printf("%d\n", *(p+1)); // arr[1] 값 출력 (20)
  • 배열의 주소를 포인터 변수에 저장하고, 이를 통해 배열 요소를 참조할 수도 있습니다.
  • 실행문에서 간접 연산자 *이 사용되었으니 *(p + n)은 n번째 요소의 주소에 저장된 값을 가져옵니다.
728x90

📌 문제 코드 해설

char *p = "KOREA";

// p[0] = 'K', p[1] = 'O', p[2] = 'R', p[3] = 'E', p[4] = 'A', p[5] = '\0'
  • p는 문자열 "KOREA"의 첫 번째 문자 'K'의 주소를 가집니다. 
    • 배열 이름(p)은 배열 첫 번째 요소(k)의 주소를 가리키는 포인터
  • "KOREA"는 배열처럼 연속된 메모리에 저장됩니다.
printf("%s\n", p);
  • %s는 문자열 전체를 출력합니다.
  • p는 문자열의 시작 주소를 가리키므로 KOREA가 출력됩니다.
  • \n은 출력 시 커서를 다음 줄로 이동시키는 명령입니다.
printf("%s\n", p + 3);
  • p + 3은 문자열의 네 번째 문자 'E'의 주소를 가리킵니다.
  • 따라서 EA가 출력됩니다.
printf("%c\n", *p);
  • %c는 한 글자를 출력합니다.
  • 실행문에서 간접 연산자 * 포인터가 가리키는 주소의 값을 나타냅니다.
  • *p는 포인터가 가리키는 주소의 값 첫 번째 문자 'K'를 가져옵니다. 
printf("%c\n", *(p + 3));
  • 연산자 우선순위에 의해 p + 3이 먼저 계산됩니다.
  • 실행문에서 간접 연산자 * 포인터가 가리키는 주소의 값을 나타냅니다.
  • *(p + 3)은 포인터가 가리키는 주소의 값 네 번째 문자 'E'를 가져옵니다.  
    • p는 배열의 시작 주소를 가리키는 포인터이고, p + 3은 네 번째 요소(인덱스 3)의 주소를 계산합니다.
printf("%c\n", *p + 2);
  • 실행문에서 간접 연산자 * 포인터가 가리키는 주소의 값을 나타냅니다.
  • *p는 'K'의 ASCII 값(75)이고, *p + 2는 77에 해당하는 문자 'M'입니다. 
    • +2는 K 다음 다음 문자를 의미 (K > L > M)
  • 따라서 M이 출력됩니다.

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

728x90
반응형