Tech Trail

[정보처리기사 실기] C언어 프로그래밍 특강(5) 본문

Learning/정보처리기사

[정보처리기사 실기] C언어 프로그래밍 특강(5)

_밍지_ 2023. 11. 16. 11:16
728x90
반응형
SMALL

32번 문제

#include <stdio.h>

void main() {
    int a[] = {2, 4, 6, 8, 10}, b[] = {1, 2, 3, 4, 5};
    int *ap = a, *bp = b + 2, c, d;

    c = *(ap++); // ap가 가리키는 값을 c에 할당하고, ap를 다음 위치로 이동합니다.
    d = *(++bp); // bp를 다음 위치로 이동하고, bp가 가리키는 값을 d에 할당합니다.

    printf("%d, %d, %d, %d\n", *ap, c, *bp, d); // 변수들의 값을 출력합니다.
}
  1. int a[]int b[]는 정수 배열 ab를 선언하고 초기화합니다.
  2. int *ap = a는 정수 포인터 ap를 선언하고 배열 a를 가리키도록 초기화합니다.
  3. int *bp = b + 2는 정수 포인터 bp를 선언하고 배열 b의 세 번째 요소를 가리키도록 초기화합니다.
  4. c = *(ap++);ap가 가리키는 값을 c에 할당하고, 그 다음에 ap를 다음 위치로 이동시킵니다. 따라서 c에는 ap 초기 위치에서의 값인 4가 할당되고, ap는 다음 요소를 가리키게 됩니다.
  5. d = *(++bp);bp를 다음 위치로 이동시키고, 이 위치에서 bp가 가리키는 값을 d에 할당합니다. 따라서 d에는 bp가 가리키는 배열 b의 네 번째 요소인 4가 할당되고, bp는 다음 요소를 가리키게 됩니다.
  6. printf 함수를 사용하여 변수들의 값을 출력합니다. *ap는 현재 ap가 가리키는 위치의 값을 나타내며, *bp는 현재 bp가 가리키는 위치의 값을 나타냅니다. 따라서 출력 결과는 "4, 2, 4, 4"가 됩니다.
4, 2, 4, 4
 

33번 문제

배열 포인터 P: 길이가 5인 배열을 가리키는 포인터

#include <stdio.h>

void main() {
    char a[30] = {"ENG\0INE\0AC"};
    char (*p)[5];
    p = a;

    printf("%s, ", p);
    printf("%s, ", ++p);
    printf("%s", ++p);
}

1. char a[30] = {"ENG\0INE\0AC"};: 문자열을 저장하기 위한 문자 배열 a를 선언하고 초기화합니다. a에는 "ENG\0INE\0AC"라는 문자열이 저장됩니다. 여기서 문자열들은 NULL 문자인 \0로 구분되며, NULL 문자를 만나면 해당 문자열이 종료됩니다. 배열 a의 길이는 30이지만, 각 문자열은 길이가 5인 문자열로 구성됩니다.

ENG\0I
NE\0AC
 

2. char (*p)[5];: 문자열 배열을 가리키는 포인터 p를 선언합니다. p는 길이가 5인 문자열을 가리킬 것입니다.

3. p = a;: 포인터 p를 문자열 배열 a의 시작 주소로 초기화합니다.

4. printf("%s, ", p);: p가 현재 가리키는 문자열 "ENG\0I"까지를 출력합니다. NULL 문자 \0을 만나면 문자열이 종료되므로 "ENG"까지만 출력됩니다.

5. printf("%s, ", ++p);: ++p를 사용하여 p를 다음 문자열 "NE\0AC"을 가리키도록 증가시킵니다. 다시 NULL 문자 \0을 만나면 문자열이 종료되므로 "NE"만 출력됩니다.

6. printf("%s", ++p);: ++p를 한 번 더 호출하여 p가 다음 문자열이 없는 위치를 가리키도록 증가시킵니다. 따라서 아무것도 출력되지 않습니다.

ENG\0I
NE\0AC
(문자열 없음)

<출력>

ENG, NE

따라서 출력 결과는 "ENG, NE"가 됩니다.

 

34번 문제

#include <stdio.h>

void main() {
    char *p[3] = {"ENG", "INER", "AC"}; // 문자열 포인터 배열 p를 선언하고 초기화합니다.
    
    // 각 문자열의 첫 문자를 출력합니다.
    printf("%c, %c, %c\n", *p[0], *p[1], *p[2]); // E, I, A 출력
    
    // 각 문자열의 두 번째 문자부터 끝까지 출력합니다.
    printf("%s, %s, %s\n", p[0] + 1, p[1] + 1, p[2] + 1); // NG, NER, C 출력
}

 

1. char *p[3] = {"ENG", "INER", "AC"};은 문자열 포인터 배열 p를 선언하고 초기화합니다. 배열 p에는 "ENG", "INER", "AC" 세 개의 문자열 주소가 저장됩니다.

E N G \0
I N E R \0
A C \0

2. printf("%c, %c, %c\n", *p[0], *p[1], *p[2]);은 각 문자열의 첫 번째 문자를 출력합니다. *p[0]은 "ENG" 문자열의 첫 문자인 'E'를 가리키고, *p[1]은 "INER" 문자열의 첫 문자 'I', *p[2]는 "AC" 문자열의 첫 문자 'A'를 가리킵니다. 따라서 출력 결과는 "E, I, A"가 됩니다.

*p[0] = *(p+0) = *(*(p+0)+0) = p[0][0] // 0행 0열 가리킴
*p[1] = *(p+1) = *(*(p+1)+0) = p[1][0] // 1행 0열 가리킴
*p[2] = *(p+2) = *(*(p+2)+0) = p[2][0] // 2행 0열 가리킴

3. printf("%s, %s, %s\n", p[0] + 1, p[1] + 1, p[2] + 1);은 각 문자열의 두 번째 문자부터 끝까지 출력합니다. (\0을 만나기 전까지 출력) p[0] + 1은 "ENG" 문자열의 두 번째 문자부터 끝까지인 "NG"를 가리키고, p[1] + 1은 "INER" 문자열의 두 번째 문자부터 끝까지인 "NER", p[2] + 1은 "AC" 문자열의 두 번째 문자부터 끝까지인 "C"를 가리킵니다. 따라서 출력 결과는 "NG, NER, C"가 됩니다.

(참고)

  • %c는 "character"를 나타내며, 하나의 문자를 출력하는 데 사용됩니다. 따라서 %c를 사용하면 해당 변수가 가리키는 문자 값 자체가 출력됩니다.
  • %s는 "string"을 나타내며, 문자열을 출력하는 데 사용됩니다. %s를 사용하면 해당 변수가 가리키는 문자열의 시작 주소부터 NULL 문자를 만날 때까지의 문자열이 출력됩니다.
E, I, A
NG, NER, C
 

따라서 출력 결과는 "E, I, A"와 "NG, NER, C"가 됩니다.

35번 문제

#include <stdio.h>

int main(int argc, char* argv[]) {
    int i, a[5] = {10, 25, 30, 40, 80}; // 정수 배열 a를 선언하고 초기화합니다.
    void *p = a + 2; // void 포인터 p를 선언하고 a의 세 번째 요소를 가리키도록 초기화합니다.

    *(int *)p += 12; // p를 int 포인터로 캐스팅하고 해당 위치의 값을 12 증가시킵니다.
    *((int *)p + 2) += 2; // p를 int 포인터로 캐스팅하고 다음 두 번째 위치의 값을 2 증가시킵니다.

    for (i = 0; i < 5; i++) {
        printf("%d ", a[i]); // 배열 a의 각 요소를 출력합니다.
    }
}
  1. int i, a[5] = {10, 25, 30, 40, 80};은 정수 배열 a를 선언하고 초기화합니다. 배열 a에는 5개의 정수가 저장되어 있습니다.
  2. void *p = a + 2;void 포인터 p를 선언하고 배열 a의 세 번째 요소인 30을 가리키도록 초기화합니다. a + 2는 배열 a에서 세 번째 요소를 가리키며, 이를 p에 할당합니다.
  3. *(int *)p += 12;p를 int 포인터로 캐스팅하고 해당 위치의 값을 12 증가시킵니다. 따라서 a[2]의 값에 12가 더해져 42가 됩니다.
  4. *((int *)p + 2) += 2;p를 int 포인터로 캐스팅하고 다음 두 번째 위치의 값을 2 증가시킵니다. 이것은 a[4]의 값에 2가 더해져 82가 됩니다.
  5. for 루프를 사용하여 배열 a의 각 요소를 출력합니다.
10 25 42 40 82
 

따라서 출력 결과는 "10 25 42 40 82"가 됩니다.

(참고) 아래 두 코드는 같은 코드를 의미합니다.

void *p = a + 2; 
*(int *)p += 12;
*((int *)p + 2) += 2;
int *p = a + 2; 
*p += 12;
*(p + 2) += 2;

 

36번 문제

#include <stdio.h>

void main() {
    int a[2][3] = {{-3, 14, 5}, {1, -10, 8}}; // 2x3 크기의 2차원 배열 a를 선언하고 초기화합니다.
    int *b[] = {a[0], a[1]}; // 포인터 배열 b를 선언하고 a의 각 행의 시작 주소를 가리키도록 초기화합니다.
    int *p = b[1]; // 포인터 p를 선언하고 배열 b의 두 번째 요소인 a[1]의 시작 주소를 가리키도록 초기화합니다.

    printf("%d, ", *b[1]); // b[1]은 a[1]의 시작 주소를 가리키고, *b[1]은 a[1][0]의 값을 출력합니다. 따라서 출력은 1입니다.
    printf("%d, ", *(--p - 2)); // p를 먼저 2칸 왼쪽으로 이동시키고 a[1][0]에서 2칸 더 왼쪽으로 이동시키며 해당 위치의 값을 출력합니다. 따라서 출력은 -3입니다.
    printf("%d\n", *(*(a + 1) + 1)); // a + 1은 a[1]의 시작 주소를 의미하고, *(a + 1) + 1은 a[1][1]을 가리킵니다. 따라서 출력은 -10입니다.
}

 

1. int a[2][3]는 2x3 크기의 2차원 배열 a를 선언하고 초기화합니다. 이 배열은 두 개의 행과 각 행마다 세 개의 정수를 저장합니다.

-3 14 5
1 -10 8

2. int *b[] = {a[0], a[1]};은 포인터 배열 b를 선언하고 배열 a의 각 행의 시작 주소를 가리키도록 초기화합니다. b[0]a[0]의 시작 주소를, b[1]a[1]의 시작 주소를 가리킵니다.

b[0] -> a[0] -> -3 14 5
b[1] -> a[1] -> 1 -10 8

3. int *p = b[1];은 포인터 p를 선언하고 배열 b의 두 번째 요소인 a[1]의 시작 주소를 가리키도록 초기화합니다.

     b[0] -> a[0] -> -3 14 5
p -> b[1] -> a[1] -> 1 -10 8

4. printf("%d, ", *b[1]);b[1]a[1]의 시작 주소를 가리키고, *b[1]a[1][0]의 값을 출력합니다. 따라서 출력은 1입니다.

*b[1] = *(b[1]+0) = b[1][0] // b의 1행 0열

5. printf("%d, ", *(--p - 2));p를 먼저 2칸 왼쪽으로 이동시키고 (--p), 그 위치에서 2칸 더 왼쪽으로 이동시켜서 (- 2) 해당 위치의 값을 출력합니다. 따라서 출력은 -3입니다.

                       -3 14 5
(왼쪽으로 2칸 이동 불가) 1 -10 8
-3 14 5 (따라서 5로 올라감, 그 위치에서 2칸 더 왼쪽으로 이동)
1 -10 8

6. printf("%d\n", *(*(a + 1) + 1));a + 1a[1]의 시작 주소를 의미하고, *(a + 1) + 1a[1][1]을 가리킵니다. 따라서 출력은 -10입니다.

*(*(a + 1) + 1) = a[1][1]

<출력>

1, -3, -10

따라서 출력 결과는 "1, -3, -10"이 됩니다.

37번 문제

#include <stdio.h>

int main() {
    int a[2][3][5] = {
        {
            {1, 2, 3, 4, 5},
            {6, 7, 8, 9, 10},
            {11, 12, 13, 14, 15}
        },
        {
            {16, 17, 18, 19, 20},
            {21, 22, 23, 24, 25},
            {26, 27, 28, 29, 30}
        }
    };

    printf("%d\n", *(*(*(a + 1) + 2) + 3) + *(**a + 2) + *(**(a + 1) + 2));
    return 0;
}

 

1. int a[2][3][5]는 3차원 배열 a를 선언하고 초기화합니다. 이 배열은 2개의 3x5 행렬로 구성되어 있습니다.

         0열 1열 2열 3열 4열
0면; 0행; 1   2   3   4   5
     1행; 6   7   8   9   10
     2행; 11  12  13  14  15

1면; 0행; 16  17  18  19  20
     1행; 21  22  23  24  25
     2행; 26  27  28  29  30

2. printf("%d\n", *(*(*(a + 1) + 2) + 3) + *(**a + 2) + *(**(a + 1) + 2));는 복잡한 표현식으로 배열 a의 특정 요소 값을 계산하여 출력합니다.

*(*(*(a + 1) + 2) + 3) = a[1][2][3] // 1면 2행 3열
**a = *(*(a+0)+0) 이므로
*(**a + 2) = *(*(*(a+0)+0)+2) = a[0][0][2] // 0면 0행 2열
*(a+1) = a[1]
*(**(a + 1) + 2)) = *(*a[1]+2) 이고,
*a[1] = *(a[1]+0) = *(*(a+1)+0) 이므로 
*(**(a + 1) + 2)) = *(*(*(a+1)+0)+2) = a[1][0][2] // 1면 0행 2열
  • *(a + 1)a의 두 번째 행렬에 대한 포인터를 얻습니다.
  • *(a + 1) + 2는 두 번째 행렬에서 세 번째 행에 대한 포인터를 얻습니다.
  • *(*(a + 1) + 2) + 3은 세 번째 행의 네 번째 요소 값을 얻습니다.
  • **aa의 첫 번째 행렬의 첫 번째 행에 대한 포인터를 얻습니다.
  • **a + 2는 첫 번째 행의 세 번째 요소 값을 얻습니다.
  • *(**(a + 1) + 2)는 두 번째 행렬의 세 번째 행의 세 번째 요소 값을 얻습니다.

3. 최종적으로 이러한 값을 모두 더하면 출력 결과는 50이 됩니다.

50

따라서 출력 결과는 "50"이 됩니다.

38번 문제

#include<stdio.h>

int main(int argc, char* argv[]) {
    int i = 10, *ip = &i;
    char c = 'D', *cp = &c;

    *ip++ = ++i;
    ++*--ip;
    ++*cp++;
    *--cp = c + 3;

    printf("i = %d, c = %c\n", i, c);
    return 0;
}
  1. int i = 10, *ip = &i;은 정수 i를 10으로 초기화하고, ip 포인터를 i의 주소로 초기화합니다.
  2. char c = 'D', *cp = &c;는 문자 c를 'D'로 초기화하고, cp 포인터를 c의 주소로 초기화합니다.

3. *ip++ = ++i; 라인

  • ++i가 먼저 실행되어 i를 11로 증가시킵니다.
  • 이후 ip가 다음 위치를 가리키게 됩니다.

4. ++*--ip; 라인

  • --ip가 먼저 실행되어 ip가 이전 위치를 가리키게 됩니다. 이전 위치는 i의 값이 증가된 위치인 11을 가리킵니다.
  • 그런 다음 *--ip는 이전 위치에 있는 값을 증가시킵니다. 이전 위치에는 11이 있었으므로, *--ip는 12가 됩니다.

5. ++*cp++; 라인부터 ~

  • 우선 ++*cp를 하면 cp가 가리키는 문자 'D'가 'E'로 변경됩니다.
  • 따라서 ++*cp++를 하면 현재 cp가 가리키는 'E'를 증가시키고, 그런 다음 cp가 'F'를 가리키게 됩니다.
  • *--cp = c + 3; 라인에서 --cp를 하면 cp가 다시 'E'를 가리키게 되고, 그리고나서 c + 3으로 인해 'H'가 *--cp에 할당됩니다.
i = 12, c = H
 

따라서 출력 결과는 "i = 12, c = H"가 됩니다.

 

 

 

 

💡 이 게시글은 PC 환경에 최적화하여 작성되었습니다.

💡 위 내용은 에듀윌에서 무료로 제공한 '정보처리기사 비밀 언어 특강' 문제를 직접 풀고 정리한 것입니다.

틀린 부분이 있다면 언제든 댓글 남겨주세요 :)

💡정보처리기사 실기 시험을 준비하시는 분들께는 아래 링크에서 해당 강의를 먼저 듣는 것을 권장합니다.

IT 자격증 1위 에듀윌 (eduwill.net)

728x90
반응형
LIST