Bài giảng Kỹ thuật lập trình C: Bài 7 Con trỏ và cấp phát bộ nhớ động, cung cấp cho người học những kiến thức như: Con trỏ và địa chỉ; Cấp phát và giải phóng bộ nhớ động. Mời các bạn cùng tham khảo!
KỸ THUẬT LẬP TRÌNH C BÀI 7: CON TRỎ VÀ CẤP PHÁT BỘ NHỚ ĐỘNG Hoàng Quốc Tuấn tuanhq@fpt.edu.vn http://hoangquoctuanpro.wordpress.com Nội dung Con trỏ địa Cấp phát giải phóng nhớ động I – Con trỏ địa Toán tử địa Con trỏ Quy tắc sử dụng trỏ – Toán tử địa Các khái niệm liên quan đến biến Địa biến Khái niệm Phân loại địa biến Phép lấy địa biến 1.1 – Các khái niệm liên quan đến biến Liên quan đến biến có ba khái niệm: Tên biến Kiểu biến Giá trị biến Ví dụ: int a = 15 ; Kiểu biến Tên biến Giá trị biến 1.2 – Địa biến Khái niệm Khi khai báo “int a = 15;” − Máy cấp phát cho biến a khoảng nhớ gồm bytes liên tiếp (kích thước kiểu int bytes) − Địa biến số thứ tự byte cấp cho biến 1.2 – Địa biến Phân loại địa biến − Địa hai biến kiểu int liên tiếp cách bytes − Địa hai biến kiểu float liên tiếp cách bytes Địa kiểu int, địa kiểu float, địa kiểu double, 1.2 – Địa biến Phép lấy địa biến − Tốn tử ngơi & cho ta địa đối tượng − Phép toán & áp dụng cho đối tượng nhớ, biến phần tử mảng − Tốn tử & khơng áp dụng cho biểu thức, biến có kiểu register (các biến chứa ghi CPU) – Con trỏ Khái niệm biến trỏ Phân loại trỏ Khai báo biến trỏ Hằng trỏ 2.1 – Khái niệm biến trỏ Con trỏ loại biến dùng để lưu địa Mỗi loại địa có kiểu trỏ tương ứng (phụ thuộc vào loại liệu lưu trữ địa đó) 10 – Khái niệm biến động Ví dụ: char *cp; // khai báo trỏ cp = (char*) malloc(75 * sizeof(char)); //tạo biến động Đoạn chương trình cấp phát nhớ gán địa khối nhớ cho trỏ cp Khối vùng nhớ lưu trữ dược 75 ký tự 29 – Cấp phát giải phóng nhớ Cấp phát: malloc calloc realloc Giải phóng: free 30 2.1 – Cấp phát nhớ hàm malloc Cú pháp: void * malloc(size_t size); Chức năng: Hàm malloc cấp phát vùng nhớ có kích thước size Hàm trả trỏ kiểu void chứa địa ô nhớ đầu vùng nhớ cấp phát Nếu không đủ vùng nhớ cấp phát trả giá trị NULL 31 #include #include #include void main() { clrscr(); void *v; v = malloc(100); if(v == NULL) { printf(“khong du bo nho”); exit(1); } printf(“Da cap bo nho”); getch(); } 32 2.2 – Cấp phát nhớ hàm calloc Cú pháp: (datatype*) calloc(n, sizeof(object)); Chức nằng: Cấp phát nhớ động cho kiểu liệu (có thể kiểu kiểu sở) Kiểu datatype kiểu liệu người lập trình tạo 33 #include #include #include struct hs { char ten[30]; unsigned int tuoi; unsigned int diem; } struct hs *p_hs; void main() { struct hs *p_hs; *p_hs = calloc(10, sizeof(struct hs); } 34 2.3 – Cấp phát nhớ realloc Cú pháp: (datatype *) realloc(buf_p, newsize); Chức năng: Hàm cấp phát lại nhớ Trong đó: buf_p trỏ trỏ đến vùng nhớ trước đó; newsize kích thước cần cấp phát 35 2.4 – Giải phóng nhớ free Cú pháp: void free (void *prt) Chức năng: giải phóng vùng nhớ trỏ trỏ ptr Nếu prt = NULL free khơng làm 36 #include #include #include void main() { int *num, n, i; clrscr(); printf(“Nhap so phan tu: ”); scanf(“%d”, &n); // cap bo nho num = (int*)malloc(n*sizeof(int)); for(i=0;i