일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 리눅스자격증
- 정보처리기사
- Django
- 코딩
- 리눅스마스터2급2차
- 기사자격증
- 머신러닝
- 정처기실기
- IT자격증
- 프로그래밍
- 정보처리기사기출
- SW
- 공부블로그
- C
- 웹개발
- 장고
- 리눅스마스터
- 파이썬
- 정처기기출
- 리눅스마스터2급
- python
- Linux
- Java
- 리눅스활용
- 정처기
- 자격증
- IT
- 정보처리기사실기
- 리눅스명령어
- 리눅스
- Today
- Total
Tech Trail
[정보처리기사 실기] C언어 프로그래밍 특강(5) 본문
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); // 변수들의 값을 출력합니다.
}
- int a[]와 int b[]는 정수 배열 a와 b를 선언하고 초기화합니다.
- int *ap = a는 정수 포인터 ap를 선언하고 배열 a를 가리키도록 초기화합니다.
- int *bp = b + 2는 정수 포인터 bp를 선언하고 배열 b의 세 번째 요소를 가리키도록 초기화합니다.
- c = *(ap++);은 ap가 가리키는 값을 c에 할당하고, 그 다음에 ap를 다음 위치로 이동시킵니다. 따라서 c에는 ap 초기 위치에서의 값인 4가 할당되고, ap는 다음 요소를 가리키게 됩니다.
- d = *(++bp);은 bp를 다음 위치로 이동시키고, 이 위치에서 bp가 가리키는 값을 d에 할당합니다. 따라서 d에는 bp가 가리키는 배열 b의 네 번째 요소인 4가 할당되고, bp는 다음 요소를 가리키게 됩니다.
- 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의 각 요소를 출력합니다.
}
}
- int i, a[5] = {10, 25, 30, 40, 80};은 정수 배열 a를 선언하고 초기화합니다. 배열 a에는 5개의 정수가 저장되어 있습니다.
- void *p = a + 2;는 void 포인터 p를 선언하고 배열 a의 세 번째 요소인 30을 가리키도록 초기화합니다. a + 2는 배열 a에서 세 번째 요소를 가리키며, 이를 p에 할당합니다.
- *(int *)p += 12;는 p를 int 포인터로 캐스팅하고 해당 위치의 값을 12 증가시킵니다. 따라서 a[2]의 값에 12가 더해져 42가 됩니다.
- *((int *)p + 2) += 2;는 p를 int 포인터로 캐스팅하고 다음 두 번째 위치의 값을 2 증가시킵니다. 이것은 a[4]의 값에 2가 더해져 82가 됩니다.
- 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 + 1은 a[1]의 시작 주소를 의미하고, *(a + 1) + 1은 a[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은 세 번째 행의 네 번째 요소 값을 얻습니다.
- **a는 a의 첫 번째 행렬의 첫 번째 행에 대한 포인터를 얻습니다.
- **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;
}
- int i = 10, *ip = &i;은 정수 i를 10으로 초기화하고, ip 포인터를 i의 주소로 초기화합니다.
- 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 환경에 최적화하여 작성되었습니다.
💡 위 내용은 에듀윌에서 무료로 제공한 '정보처리기사 비밀 언어 특강' 문제를 직접 풀고 정리한 것입니다.
틀린 부분이 있다면 언제든 댓글 남겨주세요 :)
💡정보처리기사 실기 시험을 준비하시는 분들께는 아래 링크에서 해당 강의를 먼저 듣는 것을 권장합니다.
'Learning > 정보처리기사' 카테고리의 다른 글
[정보처리기사 실기] Java 언어 프로그래밍 특강(7) (0) | 2023.11.16 |
---|---|
[정보처리기사 실기] Java 언어 프로그래밍 특강(6) (0) | 2023.11.16 |
[정보처리기사 실기] C언어 프로그래밍 특강(4) (0) | 2023.11.16 |
[정보처리기사 실기] C언어 프로그래밍 특강(3) (2) | 2023.11.16 |
[정보처리기사 실기] C언어 프로그래밍 특강(2) (0) | 2023.11.16 |