정보처리기사 실기 대비 - 흥달쌤 유튜브에서 C언어 배열과 포인터 강의를 보고 학습한 내용을 기록한 포스팅입니다.
1. 배열의 개념
배열
- 같은 자료형(예: int, char)의 데이터를 연속된 메모리 공간에 저장하는 변수입니다.
- 예: int arr[4] = {10, 11, 12, 13};
배열의 구조
int p[[4] = {10, 11, 12, 13};
인덱스(Index) | 값(Value) | 주소(가정) |
p[0] | 10 | 100 |
p[1] | 11 | 101 |
p[2] | 12 | 102 |
p[3] | 13 | 103 |
- 주소는 연속된 메모리에 저장되며, 한 칸 = 4바이트 라는 실제 메모리 구조는 생략하고, 가정된 주소로 이해
구분
p[1] | 인덱스 1의 값 (11) | 11 |
&p[1] | 인덱스 1의 주소 (위치) | 101 |
2. 포인터(Pointer)의 개념
✔️ 포인터
- 변수의 주소(메모리 위치) 를 저장하는 변수
- 포인터는 "주소를 담는 변수"라고 생각하면 됩니다.
✔️ 선언 방법
int a = 10;
int *p = &a; // p는 a의 주소를 저장
변수 | 의미 | 예시 값 |
*p | 그 주소에 있는 값 | 10 |
p | a의 주소를 저장 | 100 |
- *p를 역참조라 부르며, 실제 값을 읽을 때 사용합니다.
- *는 선언할 때는 포인터 변수 선언, 사용할 때는 역참조(값 접근)입니다.
3. 문자열과 포인터
char *p = "KOREA";
- "KOREA"는 문자열 리터럴로 메모리에 저장됩니다.
- p는 문자열 "KOREA"의 시작 주소를 가리킵니다.
인덱스 | 문자 | 주소 |
[0] | K | 100 |
[1] | O | 101 |
[2] | R | 102 |
[3] | E | 103 |
[4] | A | 104 |
[5] | \0 | 105 |
예제 코드 풀이
#include <stdio.h>
int main(void) {
char *p = "KOREA";
printf("%s\n", p); // (1)
printf("%s\n", p + 3); // (2)
printf("%c\n", *p); // (3)
printf("%c\n", *(p + 3)); // (4)
printf("%c\n", *p + 2); // (5)
return 0;
}
1. printf("%s\n", p);
- %s는 문자열 전체를 출력합니다.
- p는 "KOREA"의 시작 주소를 가리키므로 → KOREA 출력
2. printf("%s\n", p + 3);
- p + 3은 주소 100에서 3칸 이동 → 주소 103 → 문자 'E' 위치
- 문자열은 해당 주소부터 끝까지 출력 → EA 출력
3. printf("%c\n", *p);
- %c는 문자 하나 출력
- *p는 주소 100에 있는 값 → K 출력
4. printf("%c\n", *(p + 3));
- p + 3 → 주소 103 → 문자 'E'
- *() → 그 주소의 값 출력 → E 출력
5. printf("%c\n", *p + 2);
- *p → 문자 'K' (아스키코드 75)
- 75 + 2 = 77 → 아스키코드 'M' → M 출력
표현 | 의미 | 결과 |
p | "KOREA"의 시작 주소 | 100 (가정) |
p + 3 | 주소 103 | |
*p | 주소 100의 값 → 'K' | 'K' |
*(p + 3) | 주소 103의 값 → 'E' | 'E' |
*p + 2 | 'K' + 2 = 77 → 아스키 'M' | 'M' |
%s | 문자열 출력 (null까지 출력) | KOREA |
%c | 문자 1개 출력 | K, E, M |
마무리
- %s : 문자열, %c : 문자 1개
- *p + n은 괄호 유무에 따라 값이 달라짐 → (*p) + n vs *(p + n)
- 주소값은 머릿속에 배열처럼 그려서 위치 추론