intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Kỹ thuật lập trình: Chương 7 - Trần Quang

Chia sẻ: _ _ | Ngày: | Loại File: PDF | Số trang:28

7
lượt xem
2
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Bài giảng Kỹ thuật lập trình: Chương 7 - Con trỏ, được biên soạn gồm các nội dung chính sau: 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;...Mời các bạn cùng tham khảo!

Chủ đề:
Lưu

Nội dung Text: Bài giảng Kỹ thuật lập trình: Chương 7 - Trần Quang

  1. Chương 07 CON TRỎ Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 1
  2. 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  Toán tử & với con trỏ  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
  3. Tổ chức bộ nhớ thực thi  Tổ chức bộ nhớ khi chương trình nạp vào để thực thi Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 3
  4. 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
  5. Tổ chức bộ nhớ thực thi Vùng DATA  Dữ liệu đã được khởi tạo (initialized)  Dữ liệu không được 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 Kỹ thuật lập trình Chương 06: Con trỏ © 2016 5
  6. 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: http://chortle.ccsu.edu/) http://proprogramming.org/) Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 6
  7. Tổ chức bộ nhớ thực thi Vùng STACK  Chứa các biến khai báo trong chương trình  Thông tin các lần gọi hàm Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 7
  8. Ứ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
  9. Ứng dụng của con trỏ  Mảng trong C  Khi thêm vào và xóa các phần tử trên mảng, cần phải dịch phải và trái nhiều phần tử  tốn nhiều thời gian  Yêu cầu: Có cách tổ chức dữ liệu nào giúp các phép quản lý phần tử nói trên nhanh chóng  Giải pháp:  Sử dụng danh sách liên kết  dùng con trỏ Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 9
  10. 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
  11. Toán tử &  Dùng để lấy địa chỉ của một biến  Ví dụ: int a = 100; printf("%d\n", a); printf("%p\n", &a); Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 11
  12. 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
  13. Khai báo con trỏ *; * = 0; //NULL * = &; Ví dụ: int a; // biến số nguyên int *p1; // con trỏ đến số nguyên, giá trị chưa xác định int *p2 = 0; // con trỏ đến số nguyên, giá trị là NULL int *p3 = &a; // con trỏ đến số nguyên, giá trị là địa chỉ của biến a Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 13
  14. 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
  15. Các phép toán trên con trỏ  Tăng, giảm: ++, --  Cộng, trừ: +, -  Cộng, trừ kết hợp gán: +=, -=  So sánh: ==, != Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 15
  16. 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
  17. Con trỏ và mảng  Con trỏ và mảng có nhiều điểm giống nhau. Cả 2 đều giữ địa chỉ của ô nhớ  Con trỏ: giữ địa chỉ của một ô nhớ nào đó  Mảng: giữ địa chỉ của phần tử đầu tiên Do đó:  Có thể gán mảng vào con trỏ  Nhưng không thể gán con trỏ vào mảng Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 17
  18. 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 chỉ phần tử đầu tiên của mảng int *p = a; 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
  19. Con trỏ và mảng  Con trỏ và mảng có cùng cách truy cập các ô nhớ  Dùng toán tử [ ]  Dùng toán tử * và + int a[5]; int *p = a; int id = 2; a[id] = 100; p[id] = 100; Giống nhau *(a + id) = 100; *(p + id) = 100; Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 19
  20. 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
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
4=>1