Slide 1 Trần Quang © 2016 Kỹ thuật lập trình 1 Chương 06 Con trỏ Chương 07 CON TRỎ Trần Quang © 2016 Kỹ thuật lập trình 2 Chương 06 Con trỏ Nội dung Tổ chức bộ nhớ Ứng dụng của con trỏ Mô hình c[.]
Chương 07 CON TRỎ Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình Nội dung Tổ chức nhớ Ứng dụng trỏ Mơ hình trỏ Toán tử & Khai báo trỏ Toán tử * Các phép toán Con trỏ mảng Cấp phát nhớ động Trần Quang © 2016 Con trỏ cấu trúc, toán tử -> Các chủ đề nâng cao với trỏ Thứ tự đánh giá * ++, - Con trỏ const Con trỏ đến trỏ Con trỏ void Chương 06: Con trỏ Kỹ thuật lập trình Tổ chức nhớ thực thi Tổ chức nhớ chương trình nạp vào để thực thi Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình Tổ chức nhớ thực thi Vùng TEXT Chứa mã thực thi chương trình Vùng đọc Có thể dùng chung Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình Tổ chức nhớ thực thi Vùng DATA Dữ liệu khởi tạo (initialized) Dữ liệu không khởi tạo (uninitialzed) gồm: Biến toàn cục Biến tĩnh (static) Hằng chuỗi (Nguồn: http://proprogramming.org/) Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình Tổ chức nhớ thực thi Vùng HEAP Chứa nhớ xin cấp phát động người lập trình Liên quan đến kiểu liệu trỏ chương (Nguồn: http://proprogramming.org/) http://chortle.ccsu.edu/) Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình Tổ chức nhớ thực thi Vùng STACK Chứa biến khai báo chương trình Thơng tin lần gọi hàm Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình Ứng dụng trỏ Mảng C 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í u cầu: dùng mảng với số lượng phần tử cần biết lúc chương trình chạy? => Dùng trỏ Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình Ứng dụng trỏ Mảng C Khi thêm vào xóa phần tử mảng, cần phải dịch phải trái nhiều phần tử tốn nhiều thời gian Yêu cầu: Có cách tổ chức liệu giúp phép quản lý phần tử nói nhanh chóng Giải pháp: Trần Quang © 2016 Sử dụng danh sách liên kết dùng trỏ Chương 06: Con trỏ Kỹ thuật lập trình Mơ hình trỏ Biến a có địa 0x1234 FFFF 0x1234 FFFF Biến p trỏ chứa địa biến a Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình 10 Tốn tử * Tốn tử * lấy giá trị (tham khảo) địa 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 © 2016 Chương 06: Con trỏ Kỹ thuật lập trình 14 Các phép tốn trỏ Tăng, giảm: ++, -Cộng, trừ: +, Cộng, trừ kết hợp gán: +=, -= So sánh: ==, != Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình 15 Các phép tốn trỏ Gọi p trỏ có kiểu T; Các phép cộng, trừ: làm trỏ p tăng hay giảm bội số 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 © 2016 Chương 06: Con trỏ Kỹ thuật lập trình 16 Con trỏ mảng Con trỏ mảng có nhiều điểm giống Cả giữ địa ô nhớ Con trỏ: giữ địa nhớ Mảng: giữ địa phần tử Do đó: Có thể gán mảng vào trỏ Nhưng gán trỏ vào mảng Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình 17 Con trỏ mảng Ví dụ: Gán mảng vào trỏ a p giữ địa địa int a[5]; phần tử mảng int *p = a; printf ("a =%p\n", a); printf ("p =%p\n", p); Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình 18 Con trỏ mảng Con trỏ mảng có cách truy cập ô nhớ Dùng toán tử [ ] Dùng toán tử * + int a[5]; int *p = a; int id = 2; a[id] = 100; p[id] = 100; Giống *(a + id) = 100; *(p + id) = 100; Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình 19 Con trỏ mảng Con trỏ mảng có điểm khác nhau: Mảng: phần tử mảng nằm STACK Con trỏ: Các phần tử mảng trỏ đến STACK hay HEAP Trần Quang © 2016 Chương 06: Con trỏ Kỹ thuật lập trình 20