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;
}