Menu
CoddyTech

Cheat sheet C

Cập nhật lần cuối

Hello World và cấu trúc chương trình

Mọi chương trình C đều bắt đầu từ main và trả về một int.

Thành phầnCode
Khai báo header#include <stdio.h>
Điểm bắt đầu chương trìnhint main(void) { ... }
Có tham số dòng lệnhint main(int argc, char *argv[]) { ... }
In một dòngprintf("Hello, World!\n");
Trả về thành côngreturn 0;
Chú thích một dòng// comment
Chú thích nhiều dòng/* comment */

Kiểu dữ liệu

Kích thước phụ thuộc vào nền tảng; các mức tối thiểu dưới đây được tiêu chuẩn bảo đảm.

KiểuMô tả
intSố nguyên, tối thiểu 16 bit (thường là 32)
unsigned intSố nguyên không âm
long / long longSố nguyên rộng hơn (tối thiểu 32 / 64 bit)
float / doubleSố thực dấu phẩy động độ chính xác đơn / kép
charMột byte, cũng dùng để lưu ký tự
_Bool (bool qua <stdbool.h>)true hoặc false
size_tKiểu không dấu cho kích thước và chỉ số
voidKhông có kiểu: dùng cho hàm và con trỏ tổng quát

Định dạng printf và scanf

Các ký hiệu giữ chỗ khớp với kiểu của từng đối số.

Định dạngKhớp với
%d / %iint có dấu
%uint không dấu
%ld / %lldlong / long long
%fdouble (và float trong printf)
%.2fdouble với 2 chữ số thập phân
%cMột char
%sChuỗi (char *)
%pĐịa chỉ con trỏ
%xint không dấu ở dạng thập lục phân
%zusize_t

Toán tử

Toán tửÝ nghĩa
+ - * / %Số học (% là phép chia lấy dư số nguyên)
== !=Bằng / khác
< > <= >=So sánh
&& || !Logic và / hoặc / phủ định
& | ^ ~ << >>Thao tác bit: and, or, xor, not, dịch bit
++ --Tăng / giảm 1
+= -= *= /=Gán kết hợp
cond ? a : bToán tử điều kiện ba ngôi
sizeof(x)Kích thước của kiểu hoặc biến, tính bằng byte

Luồng điều khiển

Câu lệnhCú pháp
If / elseif (x > 0) { ... } else { ... }
Else ifelse if (x == 0) { ... }
Switchswitch (n) { case 1: ...; break; default: ...; }
Vòng lặp whilewhile (i < n) { ... }
Vòng lặp do-whiledo { ... } while (i < n);
Vòng lặp forfor (int i = 0; i < n; i++) { ... }
Break / continuebreak; thoát khỏi vòng lặp, continue; chuyển sang lần lặp tiếp theo
Goto (hiếm dùng)goto label; ... label:

Hàm

Khai báo trước khi dùng, hoặc thêm prototype ở đầu tệp.

Thao tácCú pháp
Định nghĩa hàmint add(int a, int b) { return a + b; }
Prototype (khai báo)int add(int a, int b);
Không có giá trị trả vềvoid greet(void) { ... }
Không có tham sốint rand_seed(void) { ... }
Truyền con trỏ (để thay đổi giá trị)void inc(int *p) { (*p)++; }
Truyền mảngint sum(int arr[], int n) { ... }
Static (chỉ dùng trong tệp)static int helper(void) { ... }

Con trỏ và bộ nhớ

Con trỏ lưu một địa chỉ. Bộ nhớ heap phải được giải phóng thủ công.

Thao tácCú pháp
Khai báo con trỏint *p;
Lấy địa chỉp = &x;
Giải tham chiếu (đọc/ghi)int y = *p; / *p = 10;
Con trỏ nullint *p = NULL;
Cấp phát trên heapint *a = malloc(n * sizeof(int));
Cấp phát và gán bằng 0int *a = calloc(n, sizeof(int));
Thay đổi kích thước vùng cấp pháta = realloc(a, newSize);
Giải phóng bộ nhớ heapfree(a);
Số học con trỏ*(a + i) tương đương a[i]

Mảng và chuỗi

Chuỗi trong C là mảng char kết thúc bằng \0.

Thao tácCú pháp
Khai báo mảngint nums[5];
Khởi tạo mảngint nums[] = {1, 2, 3};
Truy cập phần tửnums[0] = 10;
Độ dài mảng (mảng trên stack)sizeof(nums) / sizeof(nums[0])
Chuỗi hằngchar s[] = "hello";
Độ dài chuỗistrlen(s) (không tính \0)
Sao chép chuỗistrcpy(dst, src);
So sánh chuỗistrcmp(a, b) == 0 nghĩa là bằng nhau
Nối chuỗistrcat(dst, src);

Struct và thư viện chuẩn thường dùng

Thao tácCú pháp
Định nghĩa structstruct Point { int x; int y; };
Khai báo và truy cậpstruct Point p; p.x = 1;
Truy cập qua con trỏp->x = 1; (tương đương (*p).x)
Đặt tên khác cho kiểutypedef struct Point Point;
Đọc dữ liệu nhậpscanf("%d", &n);
Chuyển chuỗi thành intint n = atoi("42");
Giá trị tuyệt đối / lũy thừaabs(x) (int), pow(x, y) từ <math.h>
Sắp xếp mảngqsort(arr, n, sizeof(int), cmp);

Cú pháp C, các định dạng (format specifier) và mẫu dùng con trỏ mà bạn cần nhiều nhất, gom trong một trang. Cheat sheet C này là bảng tra cứu nhanh khi viết C: kiểu dữ liệu, định dạng printf/scanf, toán tử, luồng điều khiển, cùng các thao tác con trỏ và bộ nhớ hay khiến người học bối rối.

Mọi thứ ở đây đều là C chuẩn (C99/C11) và biên dịch được bằng gcc hoặc clang. Sao chép phần bạn cần, hoặc chạy thử bất kỳ đoạn code nào ngay trong playground C, không cần cài trình biên dịch. Đang học C? Khóa học C tương tác miễn phí của Coddy giúp bạn thực hành con trỏ, bộ nhớ và thư viện chuẩn.

Câu hỏi thường gặp về cheat sheet C

Cheat sheet C này có miễn phí không?

Có. Cheat sheet C này hoàn toàn miễn phí, không cần đăng ký. Lưu trang lại và quay lại bất cứ khi nào bạn cần tra một kiểu dữ liệu, định dạng hay thao tác con trỏ.

Stack và heap trong C khác nhau thế nào?
Bộ nhớ stack chứa biến cục bộ và tự động được giải phóng khi hàm trả về: nhanh nhưng dung lượng có hạn. Bộ nhớ heap được cấp phát tường minh bằng malloc hoặc calloc, tồn tại đến khi bạn gọi free, và được dùng khi bạn cần vùng nhớ sống lâu hơn hàm hiện tại hoặc có kích thước chỉ biết lúc chạy. Quên free bộ nhớ heap sẽ gây rò rỉ bộ nhớ (memory leak).
Vì sao scanf cần dấu & còn printf thì không?
scanf ghi giá trị ngược vào biến của bạn, nên nó cần địa chỉ của biến, và &x chính là địa chỉ đó. printf chỉ đọc giá trị, nên bạn truyền thẳng giá trị. Ngoại lệ là chuỗi: mảng char vốn đã tự chuyển thành con trỏ, nên bạn viết scanf("%s", name) mà không cần &.
Có thể luyện tập C online không?

Có. Mở playground C để biên dịch và chạy bất kỳ đoạn code nào trong cheat sheet này ngay trên trình duyệt, không cần cài trình biên dịch. Khi muốn học có lộ trình, khóa học C tương tác miễn phí của Coddy đưa bạn đi từng bước từ biến và vòng lặp đến con trỏ và quản lý bộ nhớ.

Cheat sheet này có phù hợp cho người mới bắt đầu không?

Có. Nội dung được sắp xếp từ những thành phần cơ bản hay dùng nhất (kiểu dữ liệu, printf, luồng điều khiển) đến phần nâng cao (con trỏ, bộ nhớ, struct), nên bạn có thể dùng các phần đầu ngay từ ngày đầu tiên rồi dần làm chủ phần còn lại.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học C cùng Coddy

Bắt đầu