Chương 07 CON TRỎ Lê Thành Sách Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ Nội dung n n n n n n n n n n n Tổ chức nhớ thực thi Ứng dụng trỏ Mô hình trỏ Toán tử & Khai báo trỏ Toán tử * Các phép toán trỏ Con trỏ mảng Cấp phát nhớ động Con trỏ cấu trúc, toán tử -> Các chủ đề nâng cao với trỏ n n n n Thứ tự đánh giá * ++, -Con trỏ const Con trỏ đến trỏ Con trỏ void Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ Tổ chức nhớ thực thi n Khi chương trình lên nhớ để thực thi, hệ thống tổ chức nhớ hình vẽ (Nguồn: http://proprogramming.org/) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ Tổ chức nhớ thực thi n Vùng “text” n n n Chứa mã thực thi chương trình Vùng đọc Vùng dùng chung trường hợp chương trình thực thi thường xuyên (Nguồn: http://proprogramming.org/) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ Tổ chức nhớ thực thi n Vùng “Data” n Gồm: n Dữ liệu khởi động (bởi người lập trình) n Dữ liệu không khởi động (bởi người lập trình) (Nguồn: http://proprogramming.org/) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ Tổ chức nhớ thực thi n Vùng “Data” n Gồm: n n Dữ liệu khởi động (bởi người lập trình) n Biến toàn cục n Biến tĩnh (static) Vùng gồm hai vùng con: n Chỉ đọc n Ví dụ: Hằng chuỗi n Đọc/ghi n Các biến static global không (Nguồn: http://proprogramming.org/) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ Tổ chức nhớ thực thi n Vùng “Data” n Gồm: n Dữ liệu khởi động n Dữ liệu không khởi động người lập trình n Biến toàn cục n Biến tĩnh (static) n Hệ thống khởi động (số) cho biến không người lập trình chủ động khởi động (Nguồn: http://proprogramming.org/) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ Tổ chức nhớ thực thi n Vùng “HEAP” n n Chứa nhớ xin cấp phát động người lập trình Liên quan đến Kiểu liệu trỏ nói chương (Nguồn: http://proprogramming.org/) http://chortle.ccsu.edu/) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ Tổ chức nhớ thực thi n Vùng “STACK” n Chứa n Các biến khai báo chương trình n Thông tin lần gọi hàm (Nguồn: http://proprogramming.org/) http://chortle.ccsu.edu/) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ Ứng dụng trỏ n Mảng C n n n n Phải biết trước số lượng phần tử thời điểm viết chương trình Do đó, cần phải khai báo số lượng lớn ô nhớ để sẵn Tuy nhiên, thời điểm đó, chương trình sử dụng nhiều lãng phí Yêu cầu: Có thể dùng mảng với số lượng phần tử cần biết lúc chương trình chạy? => Cần trỏ Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 10 Con trỏ cấu trúc Truy cập biến thành viên cấu trúc qua trỏ Ví dụ: gán biến thành viên cấu trúc Point3D (*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; Tổng quát: -> Như: p_ptr->x Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 37 Con trỏ cấu trúc Chương trình minh hoạ # include # include typedef struct{ float x, y, z; } Point3D; int main(){ Point3D p = {1.5f, 2.5f, 3.5f}; Point3D *p_ptr = (Point3D*)malloc(sizeof(Point3D)); (*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; printf("p = [%-4.1f, %-4.1f, %4.1f]\n", p.x, p.y, p.z); printf("*p_ptr = [%-4.1f, %-4.1f, %4.1f]\n", (*p_ptr).x, (*p_ptr).y, (*p_ptr).z); printf("*p_ptr = [%-4.1f, %-4.1f, %4.1f]\n", p_ptr->x, p_ptr->y, p_ptr->z); free(p_ptr); system("pause"); return Trường Đại Học Bách Khoa0; Trung Tâm Kỹ Thuật Điện Toán } © 2016 Lập trình C/C++ 38 Thứ tự phép toán *, ++ -v*p++ v*++p v++*p v(*p)++ // // // // *(p++) *(++p) ++(*p) Tăng vùng nhớ trỏ p đến Khi nghi ngờ, không nhớ … dùng toán tử () để phân giải độ ưu tiên Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 39 Con trỏ const int a = 20, b = 30, c = 40; ptr1: thay đổi const int * ptr1 = &a; //int const * ptr1 = &a; Giá trị mà ptr1 đến thay đổi int* const ptr2 = &b; Ô nhớ ptr1 đến (Không thể thay đổi thông qua ptr1) ptr1: Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 40 Con trỏ const int a = 20, b = 30, c = 40; const int * ptr1 = &a; int* const ptr2 = &b; ptr2: Không thể thay đổi giá trị ptr2 = làm ptr2 đến ô nhớ khác sau dòng Giá trị mà ptr2 đến thay đổi qua tr Ô nhớ ptr2 đến (Không thể thay đổi ptr2) Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 ptr2: Lập trình C/C++ 41 Con trỏ const Các lỗi thông dụng Ptr3: trỏ không khởi động tương tự cho ptr2 Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 42 Con trỏ const Các lỗi thông dụng Giá trị mà ptr1 đến không thay đổi qua trỏ ptr1 Do đó, nằm bên trái biểu thức gán Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 43 Con trỏ const Các lỗi thông dụng Con trỏ ptr2 số, nhận giá trị khởi động Sau đó, làm ptr2 đến đối tượng khác Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 44 Con trỏ const Các lỗi thông dụng ptr3: trỏ bình thường, thay đổi giá trị đến Gán trỏ ptr1 vào ptr3: khiến cho giá trị mà ptr1 đến thay đổi biên dich không cho phép Vì cho phép ý nghĩa ptr1 không Người lập trình luôn thay đổi nội dung mà ptr1 đến, cáhch dùng trỏ phụ Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 45 Con trỏ const Các lỗi thông dụng -> OK -> LỖI ptr3: trỏ bình thường, thay đổi giá trị đến Gán trỏ ptr1 vào ptr3: khiến cho giá trị mà ptr1 đến thay đổi biên dich không cho phép Vì cho phép ý nghĩa ptr1 không Người lập trình luôn thay đổi nội dung mà ptr1 đến, cáhch dùng trỏ phụ Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 46 Con trỏ const Các lỗi thông dụng -> LỖI -> OK ptr2: thay đổi giá trị Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 47 Con trỏ đến trỏ int x; int* px = &x; int** ppx = &px; int*** ppx = &ppx; Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 48 Con trỏ đến trỏ int x; int* px = &x; int** ppx = &px; int*** ppx = &ppx; Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 10 x = 10; *px = 10; **ppx = 10; ***pppx = 10; Lập trình C/C++ 49 Con trỏ void n void *ptr: trỏ chưa định kiểu n n n n Có thể ép kiểu kiểu mong muốn Như hàm malloc free Con trỏ void giúp chương trình uyển chuyển, Nhưng rủi ro kèm: biên dịch kiểm tra tương thích kiểu thời điểm biên dịch Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 50 Bài tập n Hiện thực lại tập array liệu array nằm nhớ HEAP Trường Đại Học Bách Khoa Trung Tâm Kỹ Thuật Điện Toán © 2016 Lập trình C/C++ 51