topic★★★★★난이도 · 약 30분
배열과 문자열
배열 이름은 첫 원소의 주소. `arr[i]` ≡ `*(arr+i)`. 문자열은 끝에 `\0`.
#C#배열#문자열
왜 배우는가
배열-포인터 동치성을 이해해야 코드 추적이 가능하다. strcpy/strcat/strlen 동작은 단답으로도 자주 나온다.
C 배열의 이름은 첫 원소의 주소와 같다. 그래서 `arr[i]`와 `*(arr+i)`는 완전히 동일하게 동작한다. 이것이 배열과 포인터가 긴밀하게 얽히는 이유.
c
int arr[5] = {10, 20, 30, 40, 50};
int *p = arr; // arr == &arr[0]
printf("%d\n", arr[2]); // 30
printf("%d\n", *(arr+2)); // 30 (동일)
printf("%d\n", p[2]); // 30 (동일)
printf("%d\n", *(p+2)); // 30 (동일)포인터 산술 — `p+1`은 1바이트가 아니라 `sizeof(타입)` 바이트 이동. `int *p`라면 4바이트씩, `char *p`라면 1바이트씩.
c
char str[] = "HELLO"; // H E L L O \0 (6바이트)
printf("%d\n", strlen(str)); // 5 (\0 제외)
printf("%d\n", sizeof(str)); // 6 (\0 포함)
char *s = "WORLD";
printf("%c\n", *s); // W
printf("%c\n", *(s+2)); // R`strlen`은 실제 문자 수(\0 제외), `sizeof`는 메모리 할당 크기(\0 포함). 이 차이가 시험 함정.
| 함수 | 기능 | 예시 |
|---|---|---|
| `strcpy(dst, src)` | 문자열 복사 | `""` → `"HI"` |
| `strcat(dst, src)` | 문자열 연결 | `"AB"` + `"CD"` = `"ABCD"` |
| `strlen(s)` | 길이 (`\0` 제외) | `"HELLO"` → 5 |
| `strcmp(a, b)` | 비교 (같으면 0) | `"A"` vs `"B"` → 음수 |
실기 드릴 2문항
code실기 드릴 · 코드 추적
다음 C 코드의 출력은?
c
#include <stdio.h>
int main() {
int a[5] = {1, 2, 3, 4, 5};
int *p = a;
int sum = 0;
for (int i = 0; i < 5; i++)
sum += *(p + i);
printf("%d", sum);
return 0;
}code실기 드릴 · 코드 추적
다음 C 코드의 출력은?
c
#include <stdio.h>
#include <string.h>
int main() {
char s[10] = "ABC";
strcat(s, "DEF");
printf("%d,%lu", strlen(s), sizeof(s));
return 0;
}