Bài giảng Kỹ thuật lập trình - Chương 7: Con trỏ - Trần Quang
Nội dung
- Tổ chức bộ nhớ Ứng dụng của con trỏ
- Mô hình của con trỏ
= Toán tử &
-
Khai báo trỏ *
*
= Toán tử *
= Các phép toán
= Con trỏ và mảng Cấp phát bộ nhớ động
- Con trỏ và cấu trúc, toán tử - Y
- Các chủ đề nâng cao với con trỏ
• Thứ tự đánh giá
và ++,
- Con trỏ và const - Con trỏ đến con trỏ
- Con trỏ void
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 7: Con trỏ - Trần Quang", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- bai_giang_ky_thuat_lap_trinh_chuong_7_con_tro_tran_quang.pdf
Nội dung text: Bài giảng Kỹ thuật lập trình - Chương 7: Con trỏ - Trần Quang
- Nội dung Tổ chức bộ nhớ Con trỏ và cấu trúc, Ứng dụng của con trỏ toán tử -> Mô hình của con trỏ Các chủ đề nâng cao với con trỏ Toán tử & Thứ tự đánh giá * Khai báo trỏ và ++, Toán tử * Con trỏ và const Các phép toán Con trỏ đến con trỏ Con trỏ và mảng Con trỏ void Cấp phát bộ nhớ động Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 2
- Tổ chức bộ nhớ thực thi Vùng TEXT Chứa mã thực thi của chương trình Vùng này chỉ đọc Có thể dùng chung Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 4
- Tổ chức bộ nhớ thực thi Vùng HEAP Chứa bộ nhớ xin cấp phát động bởi người lập trình Liên quan đến kiểu dữ liệu con trỏ trong chương này (Nguồn: Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 6
- Ứng dụng của con trỏ Mảng trong C Phải biết trước số lượng phần tử tại thời điểm viết chương trình Do đó, cần phải khai báo một số lượng lớn các ô nhớ để sẵn. Tuy nhiên, tại một thời điểm nào đó, chương trình có thể sẽ sử dụng ít hơn rất nhiều lãng phí Yêu cầu: có thể nào dùng mảng với số lượng phần tử chỉ cần biết lúc chương trình đang chạy? => Dùng con trỏ Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 8
- Mô hình của con trỏ Biến a có địa chỉ là 0x1234 FFFF 0x1234 FFFF Biến p là con trỏ chứa địa chỉ của biến a Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 10
- Toán tử & typedef struct sPoint3D{float x, y, z;} Point3D; void main(){ Point3D p1 = {1.0f, 2.0f, 3.0f}; printf("%-5.1f\n", p1.x); printf("%p\n", &p1); In ra địa chỉ của p1 printf("%p\n", &p1.x); In ra giá trị của p1.x printf("%p\n", &p1.y); In ra địa chỉ của p1.y printf("%p\n", &p1.z); In ra địa chỉ của p1.z } Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 12
- Toán tử * Toán tử * lấy giá trị (tham khảo) tại một địa chỉ Ví dụ: int a = 100; int *p; p = &a; printf("a : %d\n", a); printf("&a : %p\n", &a); printf("p : %p\n", p); printf("*p : %d\n", *p); printf("*&a: %d\n", *&a); Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 14
- Các phép toán trên con trỏ Gọi p là con trỏ có kiểu T; Các phép cộng, trừ: làm con trỏ p tăng hay giảm một bội số của kích thước kiểu T Ví dụ: int a = 100; int *p = &a; printf("p : %p\n", p); p++; printf("p : %p\n", p); Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 16
- Con trỏ và mảng Ví dụ: Gán mảng vào con trỏ int a[5]; a và p giữ cùng địa chỉ là địa int *p = a; chỉ phần tử đầu tiên của mảng printf ("a =%p\n", a); printf ("p =%p\n", p); Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 18
- Con trỏ và mảng Con trỏ và mảng cũng có điểm khác nhau: Mảng: các phần tử của mảng nằm trên STACK Con trỏ: Các phần tử mảng con trỏ chỉ đến có thể trên STACK hay HEAP Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 20
- Cấp phát bộ nhớ động Hàm xin cấp phát bộ nhớ malloc calloc realloc Hàm giải phóng bộ nhớ free Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 22
- Cấp phát bộ nhớ động int *p1; float *p2; int n = 100; xin cấp phát bộ nhớ p1 = (int*) malloc (n * sizeof(int)); p2 = (float*) malloc (n * sizeof(float)); free(p1); free(p2); Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 24
- Cấp phát bộ nhớ động Hàm malloc trả về NULL nếu không cấp phát được vùng nhớ. Do đó, nên kiểm tra bằng lệnh if trước khi xử lý tiếp. Ví dụ: int n = 100; int *p1 = (int*) malloc (n * sizeof(int)); if (p1 == NULL) { printf ("Khong cap phat duoc!\n"); exit(1); } else { // Tiếp tục xử lý free(p1); } Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 26
- Con trỏ và cấu trúc Truy cập biến thành viên cấu trúc qua con trỏ (*p_ptr).x = 4.5f; (*p_ptr).y = 5.5f; (*p_ptr).z = 6.5f; p_ptr->x = 7.5f; p_ptr->y = 8.5f; p_ptr->z = 9.5f; p_ptr : biến con trỏ chứa địa chỉ của một cấu trúc Point3D (*p_ptr) : Vùng nhớ của cấu trúc Point3D (*p_ptr).x : Vùng nhớ chứa biến x của cấu trúc Point3D p_ptr -> x : Vùng nhớ chứa biến x của cấu trúc Point3D, truy cập thông qua toán tử -> từ con trỏ p_ptr Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 28