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
반응형
'코딩일기 > 자격증' 카테고리의 다른 글
[정보처리기사] [ Python ] 2차원 리스트 출력 문제 | 정보처리기사 실기 기출 문제 풀이 (0) | 2024.12.17 |
---|---|
[정보처리기사] [ Java ] 반복문을 활용한 2차원 배열 생성 | 정보처리기사 실기 기출 문제 풀이 (0) | 2024.12.16 |
[정보처리기사] [ Java ] 10진수를 2진수로 변환하는 알고리즘 | 2020년 3회 정보처리기사 실기 기출문제 (0) | 2024.12.10 |
[정보처리기사] 블록체인(Blockchain) | SW 신기술 및 관련 용어 | 정보처리기사 실기 기출문제 (0) | 2024.12.10 |
[정보처리기사] 프로세스 상태 전이 | 정보처리기사 실기 기출문제 (0) | 2024.12.10 |