2. Ngôn ngữ C
• Năm sinh 1972
• Bố: Dennis Ritchie, Me: Bell Labs
• Lần nâng cấp gần đây C11, 2011
• Đa nền tảng: Linux, Unix, Mac, Windows
• Mã nguồn: *.c, *.h
3.
4. Ưu điểm
• Cú pháp đơn giản
• ~ 60% Javascript,
C++, Java…
• Thực thi nhanh
• Tiết kiệm bộ nhớ
• Đa nền tảng
• Thích hợp để học
thuật toán
Nhược điểm
• Thiếu tính năng mạnh
– Hướng đối tượng
– Chồng toán tử
– Generic programming
– Functional programming
6. Ứng dụng nổi tiếng viết bằng C
• Hầu hết các hệ điều hành
• Các phần mềm máy chủ
http://www.mycplus.com/featured-articles/top-10-
applications-written-in-c-cplusplus/
7. Lợi ích khi học C
• Nhập cuộc đơn giản, cú pháp tối giản
• Dễ dàng chuyển đổi sang ngôn ngữ khác
• Hiểu hệ điều hành quản lý bộ nhớ
• Tính năng ít, phải tự viết nhiều à
hiểu sâu
• Thạo C đi xin việc được
10. #include <stdio.h>
int main() {
printf("Hello, World!n");
return 0;
}
Nhúng thư viện có sẵn
Hàm chính luôn chạy đầu tiên
In ra terminal hoặc console
11. Công cụ soạn mã IDE Windows Linux Mac
Visual Studio $ ✔
Clion $ ✔ ✔ ✔
XCode ✔
CodeBlocks ✔
DevC ✔
NetBeans ✔ ✔ ✔
Eclipse ✔ ✔ ✔
Sublime Text $ ✔ ✔ ✔
13. printf – in ra màn hình
• (formatstring, param1, param2, param3…);
• %d decimal number
• %c character
• %s string
• %f float
• %p pointer
• n new line
14. Kết quả in ra là gì?
#include <stdio.h>
main() {
int i = 0;
for (i = 0; i < 10; i++) {
printf("Line %dn", i);
}
return 0;
}
15. Trình biên dịch - compiler
• Mac
– make
• Linux, Windows
– gcc, g++
https://www.youtube.com/watch?v=B-ru-
q_Bm2I
17. IDE
• Ứng dụng soạn thảo
code
• Giao diện đồ hoạ:
highlight syntax…
• Quản lý nhiều file
mã nguồn, dự án
• Tích hợp hoặc gọi
đến compiler
Compiler
• Trình biên dịch mã
nguồn ra file chạy
• Có nhiều option:
– Debug
– Release
• Chạy trên dòng lệnh,
không có giao diện
18. Cú pháp
• #include <stdio.h>
• #include "MyHeader.h"
• Chú thích 1 dòng //something
• Chú thích khối /* line 1
line 2 */
20. Kiểu dữ liệu số nguyên
sizeof Value range
char 1 byte -128 to 127 . Or 0 to 255
signed char 1 byte -128 to 127
unsigned char 1 byte 0 to 255
int 2 or 4 bytes -32,768 to 32,767 or -2,147,483,648 to 2,147,483,647
unsigned int 2 or 4 bytes 0 to 65,535 or 0 to 4,294,967,295
short 2 bytes -32,768 to 32,767
unsigned short 2 bytes 0 to 65,535
long 8 bytes -2^31+1 to +2^31-1
unsigned long 8 bytes 0 to 2^32-1
long long 8 or 16 bytes -2^63+1 to +2^63-1
21. #include <stdio.h>
void main() {
int a = 10;
float pi = 3.14158;
char c = 32;
long long bigLong = 100;
long largeInt = 10000;
double bigFloat = 1.168;
printf("size %lu", sizeof(bigLong));
}
23. Dấu phẩy động –floating point types
Type Size Value range Precision
float 4 bytes 1.2E-38 to
3.4E+38
6 decimal
places
double 8 bytes 2.3E-308 to
1.7E+308
15 decimal
places
long double 10 bytes 3.4E-4932 to
1.1E+4932
19 decimal
places
24. Kiểu void
• Không có gì, không tồn tại
• Không dùng void khai báo biến
• Dùng void * khai báo con trỏ kiểu
không xác định
• Hàm không trả về giá trị
void doSomething() {
printf("Return nothing from this func");
}
void* a;
25. Sử dụng void
#include <stdio.h>
void doSomething() {
printf("Do something returns nothing");
}
main() {
//void a; //Cannot compile
int x = 10;
void* b = &x;
printf("%dn", *(int*)b);
doSomething();
return 0;
}
26. Ký tự - char
• Ký tự trong C chiếm 1 byte, không
hỗ trợ unicode
char c ='C';
char space = 32;
char six = '0' + 6;
Xem quy chuẩn bẳng mã ASCII
https://vi.wikipedia.org/wiki/ASCII
27. In tuần tự a-z
#include <stdio.h>
main() {
char c;
for (c = 'a'; c < 'z'; c++) {
printf("%cn", c);
}
return 0;
}
29. Con trỏ - Pointer
• Nhiều ngôn ngữ lập trình không
cần con trỏ: Visual Basic, C#,
Swift, Java, Javascript, Scala
• Tại sao C vẫn dùng con trỏ?
• Liệu con trỏ có thực sự cần thiết
30. Tại sao C dùng con trỏ ?
• C rất sát với hệ điều hành
• Quản lý bộ nhớ thủ công – nhanh
nhưng rủi ro
• Con trỏ để tham chiếu đến các
biến trong bộ nhớ
• Cấp phát – giải phóng bộ nhớ
31. #include <stdio.h>
int main() {
int a = 10;
int *p = &a;
printf("Value p points to %dn", *p);
printf("Address that p points at %pn", p);
printf("Address of p itself in mem %pn", &p);
a = 11;
printf("New value p points to %dn", *p);
return 0;
}
Value p points to 10
Address of p points to 0x7fff5c049b68
Address of actual p 0x7fff5c049b60
New value p points to 11
33. Con trỏ có kích thước không?
• Ở hệ điều hành 32bit, nó chiếm 4
bytes, ở hệ 64bit, nó chiếm 8
bytes
• 32 bits = 4 bytes, dải vùng nhớ
khoảng 4GB
• 64 bits = 8 bytes lớn gấp 2^32
lần
35. Khả năng đánh địa chỉ hệ 64 bit
You will never, ever be able to assemble a system that has
264 bytes (16 exibytes) of physical RAM.
Second, just because an architecture uses 64-bit pointers,
doesn't mean that all the bits of those pointers are actually
used. Notably, current x86-64 CPUs (aka AMD64 and Intel's
current 64-bit chips) actually use 48-bit address lines
(AMD64) and 42-bit address lines (Intel)
(see http://en.wikipedia.org/wiki/X86_64#Virtual_address_space
_details ), theoretically allowing 256 terabytes of physical
RAM.
Trích
https://superuser.com/questions/168114/how-much-memory-can-a-
64bit-machine-address-at-a-time/168120
38. Đặc điểm mảng
• Phần tử đầu tiên đánh vị trí 0
• Không thay đổi được kích thước
sau khi khai báo
• Các phần tử nằm liên tiếp nhau
39. #include <stdio.h>
#include <stdlib.h>
int main() {
const int N = 10;
int *intArray = malloc(N * sizeof(int));
free(intArray);
int i = 0;
while (i < N) {
intArray[i] = i;
i++;
}
free(intArray);
return 0;
}
40. int int2D[3][3] =
{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d", int2D[i][j]);
if (j < 2) {
printf(", ");
} else {
printf("n");
}
}
}
Mảng 2 chiều
1, 2, 3
4, 5, 6
7, 8, 9
In ra
42. H e l l o W o r l d 0
p
Terminated
character,
value = 0;
0 1 2 3 4 5 6 7 8 9 10
p[2]
char* p ="Hello World";
strlen(p) == 11
43. Thư viện <string.h>
• strlen trả về số ký tự
• strcpy copy từ mảng này sang mảng kia
• memset đặt 1 ký tự N lần vào mảng
• strcmp so sánh 2 chuỗi
https://www.tutorialspoint.com/c_standard_libr
ary/string_h.htm
46. Boolean: đúng hoặc sai
• C không có kiểu nguyên thuỷ
boolean
• Dùng kiểu char lấy giá trị 0 hoặc
1 để thay thế
• Hoặc dùng thư viện stdbool.h
47. #include <stdbool.h>
int main() {
bool continueLoop = true;
int i = 0;
while (continueLoop) {
if (i > 10) continueLoop = false;
i++;
}
return 0;
}
48. struct
• Gom nhiều biến liên quan thành
một cụm
• Có thể định nghĩa kiểu để tái sử
dụng
49. int main() {
struct Book {
char *title;
char *author;
int ISBN;
} book;
struct Book b;
b.title = "The C Programming Language";
b.author = "Brian W Kernighan & Dennis M. Ritchie";
b.ISBN = 0131101633;
return 0;
}
50. typedef
typedef struct {
char *title;
char *author;
int ISBN;
} Book;
struct Book {
char *title;
char *author;
int ISBN;
};
Ngắn gọn hơn
typedef đặt tên mới cho kiểu
51. #include <stdio.h>
typedef unsigned char BYTE;
typedef unsigned char BOOL;
#define true 1
#define false 0
int main() {
BYTE rock = 125;
BOOL isTrue = true;
if (isTrue) {
printf("%d", rock);
}
return 0;
}
typedef đặt tên kiểu mới
#define đặt tên giá trị
53. C có hỗ trợ hướng đối tượng?
• Không. C++ hỗ trợ hướng đối tượng
• C++ là ngôn ngữ phát triển lên từ
C
54. C-99, C-11 là gì?
• C-99 là tiêu chuẩn C được thống
nhất năm 1999
• C—11 là tiêu chuẩn C được thống
nhất năm 2011
55. File binary biên dịch ở Windows có chạy được trên Linux không?
• Không
• Mã nguồn C là portable, có thể
biên dịch lại trên các hệ điều
hành khác nhau
• Nhưng file binary biên dịch không
portable