C 치트시트
마지막 업데이트
Hello World 및 프로그램 구조
모든 C 프로그램은 main에서 시작해 int를 반환합니다.
| 요소 | 코드 |
|---|---|
| 헤더 포함 | #include <stdio.h> |
| 진입점 | int main(void) { ... } |
| 명령줄 인자와 함께 | int main(int argc, char *argv[]) { ... } |
| 한 줄 출력 | printf("Hello, World!\n"); |
| 성공 반환 | return 0; |
| 한 줄 주석 | // comment |
| 블록 주석 | /* comment */ |
자료형
크기는 플랫폼에 따라 다르며, 아래 최솟값은 표준이 보장합니다.
| 타입 | 설명 |
|---|---|
int | 정수, 최소 16비트 (보통 32비트) |
unsigned int | 음수가 아닌 정수 |
long / long long | 더 넓은 정수 (최소 32 / 64비트) |
float / double | 단정밀도 / 배정밀도 부동소수점 |
char | 단일 바이트, 문자에도 사용됨 |
_Bool (bool via <stdbool.h>) | true 또는 false |
size_t | 크기와 인덱스용 부호 없는 타입 |
void | 타입 없음 - 함수와 제네릭 포인터에 사용 |
printf 및 scanf 형식 지정자
각 인자의 타입과 맞추는 자리표시자.
| 지정자 | 대응 타입 |
|---|---|
%d / %i | 부호 있는 int |
%u | 부호 없는 int |
%ld / %lld | long / long long |
%f | double (printf에서는 float도) |
%.2f | 소수점 둘째 자리까지의 double |
%c | 단일 char |
%s | 문자열 (char *) |
%p | 포인터 주소 |
%x | 16진수로 표현한 부호 없는 int |
%zu | size_t |
연산자
| 연산자 | 의미 |
|---|---|
+ - * / % | 산술 (%는 정수 나머지) |
== != | 같음 / 같지 않음 |
< > <= >= | 비교 |
&& || ! | 논리 and / or / not |
& | ^ ~ << >> | 비트 and, or, xor, not, 시프트 |
++ -- | 증가 / 감소 |
+= -= *= /= | 복합 대입 |
cond ? a : b | 삼항 조건 |
sizeof(x) | 타입이나 변수의 크기 (바이트) |
제어 흐름
| 문(statement) | 문법 |
|---|---|
| if / else | if (x > 0) { ... } else { ... } |
| else if | else if (x == 0) { ... } |
| switch | switch (n) { case 1: ...; break; default: ...; } |
| while 반복문 | while (i < n) { ... } |
| do-while 반복문 | do { ... } while (i < n); |
| for 반복문 | for (int i = 0; i < n; i++) { ... } |
| break / continue | break;는 반복문을 빠져나가고, continue;는 다음 반복으로 건너뜀 |
| goto (드물게) | goto label; ... label: |
함수
사용하기 전에 선언하거나, 파일 상단에 프로토타입을 추가하세요.
| 작업 | 문법 |
|---|---|
| 함수 정의 | int add(int a, int b) { return a + b; } |
| 프로토타입 (선언) | int add(int a, int b); |
| 반환값 없음 | void greet(void) { ... } |
| 매개변수 없음 | int rand_seed(void) { ... } |
| 포인터로 전달 (변경) | void inc(int *p) { (*p)++; } |
| 배열 전달 | int sum(int arr[], int n) { ... } |
| static (파일 지역) | static int helper(void) { ... } |
포인터 및 메모리
포인터는 주소를 담습니다. 힙 메모리는 수동으로 해제해야 합니다.
| 작업 | 문법 |
|---|---|
| 포인터 선언 | int *p; |
| 주소 연산자 | p = &x; |
| 역참조 (읽기/쓰기) | int y = *p; / *p = 10; |
| 널 포인터 | int *p = NULL; |
| 힙에 할당 | int *a = malloc(n * sizeof(int)); |
| 할당 + 0으로 초기화 | int *a = calloc(n, sizeof(int)); |
| 할당 크기 조정 | a = realloc(a, newSize); |
| 힙 메모리 해제 | free(a); |
| 포인터 산술 | *(a + i)는 a[i]와 같음 |
배열 및 문자열
C의 문자열은 \0로 끝나는 char 배열입니다.
| 작업 | 문법 |
|---|---|
| 배열 선언 | int nums[5]; |
| 배열 초기화 | int nums[] = {1, 2, 3}; |
| 원소 접근 | nums[0] = 10; |
| 배열 길이 (스택 배열) | sizeof(nums) / sizeof(nums[0]) |
| 문자열 리터럴 | char s[] = "hello"; |
| 문자열 길이 | strlen(s) (\0 제외) |
| 문자열 복사 | strcpy(dst, src); |
| 문자열 비교 | strcmp(a, b) == 0이면 같음 |
| 문자열 연결 | strcat(dst, src); |
구조체 및 자주 쓰는 표준 라이브러리
| 작업 | 문법 |
|---|---|
| 구조체 정의 | struct Point { int x; int y; }; |
| 선언 및 접근 | struct Point p; p.x = 1; |
| 포인터로 접근 | p->x = 1; ((*p).x와 같음) |
| 타입 별칭 | typedef struct Point Point; |
| 입력 읽기 | scanf("%d", &n); |
| 문자열을 int로 변환 | int n = atoi("42"); |
| 절댓값 / 거듭제곱 | abs(x) (int), <math.h>의 pow(x, y) |
| 배열 정렬 | qsort(arr, n, sizeof(int), cmp); |
가장 자주 쓰는 C 문법, 형식 지정자, 포인터 패턴을 한 페이지에 담았습니다. 이 C 치트시트는 C를 작성하기 위한 빠른 참조 자료입니다 - 자료형, printf/scanf 지정자, 연산자, 제어 흐름, 그리고 사람들이 자주 헷갈리는 포인터와 메모리 연산을 다룹니다.
여기 나오는 모든 내용은 표준 C(C99/C11)이며 gcc나 clang으로 컴파일됩니다. 필요한 것을 복사하거나, C 플레이그라운드에서 어떤 코드든 바로 실행해 보세요 - 컴파일러를 설치할 필요가 없습니다.
C 치트시트 자주 묻는 질문
이 C 치트시트는 무료인가요?
네. 이 C 치트시트는 완전히 무료이며 회원 가입이 필요 없습니다. 즐겨찾기에 추가해 두고 타입, 형식 지정자, 포인터 연산을 찾아봐야 할 때마다 다시 방문하세요.
C에서 스택과 힙의 차이는 무엇인가요?
스택 메모리는 지역 변수를 담고 함수가 반환될 때 자동으로 해제됩니다 - 빠르지만 크기가 제한적입니다. 힙 메모리는
malloc이나 calloc으로 명시적으로 할당되고 free를 호출할 때까지 유지되며, 현재 함수보다 오래 살아야 하거나 크기를 실행 시점에만 알 수 있는 메모리가 필요할 때 사용합니다. 힙 메모리를 free하는 것을 잊으면 메모리 누수가 발생합니다.scanf는 앰퍼샌드(&)가 필요한데 printf는 왜 필요 없나요?
scanf는 값을 변수에 다시 써넣으므로 변수의 주소가 필요합니다 - 바로 &x가 그것을 제공합니다. printf는 값을 읽기만 하므로 값 자체를 전달합니다. 예외는 문자열입니다: char 배열은 이미 포인터로 변환(decay)되므로 & 없이 scanf("%s", name)으로 전달합니다.C를 온라인에서 연습할 수 있나요?
네. C 플레이그라운드를 열어 이 치트시트의 어떤 코드든 브라우저에서 컴파일하고 실행해 보세요 - 컴파일러를 설치할 필요가 없습니다. 체계적으로 배우고 싶다면, Coddy의 무료 인터랙티브 C 강좌가 변수와 반복문부터 포인터와 메모리 관리까지 단계별로 안내합니다.
이 치트시트는 초보자에게 적합한가요?
네. 가장 흔한 구성 요소(타입, printf, 제어 흐름)부터 고급 요소(포인터, 메모리, 구조체)까지 순서대로 정리되어 있어, 첫날부터 상단 섹션을 사용하고 점차 나머지로 넓혀갈 수 있습니다.