Xem mẫu

  1. 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
  2. Nội dung Con trỏ và địa chỉ Cấp phát và giải phóng bộ nhớ động 2
  3. I – Con trỏ và địa chỉ 1. Toán tử địa chỉ 2. Con trỏ 3. Quy tắc sử dụng con trỏ 3
  4. 1 – Toán tử địa chỉ Các khái niệm liên quan đến biến Địa chỉ của biến Khái niệm Phân loại địa chỉ biến Phép lấy địa chỉ của một biến 4
  5. 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ị của biến Ví dụ: int a = 15 ; Kiểu biến Tên biến Giá trị của biến 5
  6. 1.2 – Địa chỉ của biến Khái niệm Khi khai báo “int a = 15;” − Máy sẽ cấp phát cho biến a một khoảng nhớ gồm 2 bytes liên tiếp (kích thước kiểu int là 2 bytes). − Địa chỉ của biến là số thứ tự của byte đầu tiên được cấp cho biến. 6
  7. 1.2 – Địa chỉ của biến Phân loại địa chỉ biến − Địa chỉ của hai biến kiểu int liên tiếp cách nhau 2 bytes. − Địa chỉ của hai biến kiểu float liên tiếp cách nhau 4 bytes. Địa chỉ kiểu int, địa chỉ kiểu float, địa chỉ kiểu double,... 7
  8. 1.2 – Địa chỉ của biến Phép lấy địa chỉ của một biến − Toán tử một ngôi & cho ta địa chỉ của một đối tượng. − Phép toán & chỉ áp dụng cho các đối tượng trong bộ nhớ, đó là các biến và các phần tử mảng. − Toán tử & không áp dụng cho các biểu thức, các hằng và các biến có kiểu register (các biến này chứa trong thanh ghi của CPU). 8
  9. 2 – Con trỏ Khái niệm biến con trỏ Phân loại con trỏ Khai báo biến con trỏ Hằng con trỏ 9
  10. 2.1 – Khái niệm biến con trỏ Con trỏ là một loại biến dùng để lưu địa chỉ Mỗi loại địa chỉ sẽ có một kiểu con trỏ tương ứng (phụ thuộc vào loại dữ liệu lưu trữ trong địa chỉ đó) 10
  11. 2.2 – Phân loại con trỏ Tùy thuộc vào kiểu biến mà con trỏ trỏ đến, ta phân loại được các con trỏ. Con trỏ kiểu int chứa địa chỉ các biến kiểu int, con trỏ kiểu float chứa địa chỉ của các biến kiểu float,... 11
  12. 2.3 – Khai báo biến con trỏ Con trỏ không kiểu − Con trỏ không kiểu có thể chứa bất kỳ một địa chỉ nào. − Cú pháp: void *tên_biến_con_trỏ; − Ví dụ: void *p, *q; 12
  13. 2.3 – Khai báo biến con trỏ Con trỏ có kiểu − Con trỏ có kiểu chỉ chứa những địa chỉ của loại dữ liệu phù hợp với kiểu dữ liệu mà ta đã khai báo cho con trỏ. − Cú pháp: kiểu_dữ_liệu *tên_biến_con_trỏ; − Ví dụ: int *p, *q; float *x; 13
  14. 2.4 – Hằng con trỏ Đối với các biến, từ khóa const dùng để khai báo và khởi đầu giá trị cho các biến mà sau này giá trị của nó không được phép thay đổi bởi các lệnh trong chương trình. Chúng được gọi là các đối tượng hằng. Đối với con trỏ, từ khóa const được dùng để khai báo các đối số con trỏ mà trong thân hàm ta không được phép thay đổi giá trị các đối tượng được trỏ bởi các đối tượng này. 14
  15. 2.4 – Hằng con trỏ Ví dụ 1: #include void main() { const int a = 10; a++; // sai, khong duoc thay doi bien const a printf(“\n a = %d”, a); } 15
  16. 2.4 – Hằng con trỏ Ví dụ 2: void thu_nghiem(const int *stt) { *stt = *stt + 1; // Sai, khong duoc thay doi gia tri cua bien // dang duoc tro boi con tro stt } 16
  17. 3 – Quy tắc sử dụng con trỏ Tên con trỏ Các phép toán trên con trỏ Toán tử * 17
  18. 3.1 – Tên con trỏ Tên con trỏ được đặt theo quy tắc đặt tên định danh. Ví dụ: float a, *p, *q; p = &a; /* con trỏ p trỏ đến địa chỉ biến a */ q = p; /* con trỏ q trỏ đến địa chỉ mà con trỏ p đang trỏ đến*/ 18
  19. 3.2 - Các phép toán trên con trỏ Phép gán Phép tăng giảm địa chỉ Phép so sánh Toán tử * 19
  20. 3.2 - Các phép toán trên con trỏ Phép gán − Chỉ nên thực hiện phép gán cho các con trỏ cùng kiểu. − Ví dụ: int x = 1, *pi, *qi; pi = &x; qi = pi; − Kết quả các câu lệnh trên là con trỏ pi và qi đều trỏ đến địa chỉ của biến x. 20
nguon tai.lieu . vn