Bài giảng Kỹ thuật lập trình: Chương 7 - Lê Thành Sách

51 51 0
Bài giảng Kỹ thuật lập trình: Chương 7 - Lê Thành Sách

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Bài giảng Kỹ thuật lập trình - Chương 7: Con trỏ Cung cấp cho người học các kiến thức: Tổ chức bộ nhớ thực thi, ứng dụng của con trỏ, mô hình của con trỏ, các phép toán trên con trỏ, con trỏ và mảng,... Mời các bạn cùng tham khảo nội dung chi tiết.

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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt 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ỏ Tố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 CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt 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 CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ https://fb.com/tailieudientucntt Ứ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í 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 CuuDuongThanCong.com © 2016 Lập trình C/C++ 10 https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 37 https://fb.com/tailieudientucntt 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 Tốn } CuuDuongThanCong.com https://fb.com/tailieudientucntt © 2016 Lập trình C/C++ 38 Thứ tự phép tố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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 39 https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 40 https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 ptr2: Lập trình C/C++ 41 https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 42 https://fb.com/tailieudientucntt 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 CuuDuongThanCong.com © 2016 Lập trình C/C++ 43 https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 44 https://fb.com/tailieudientucntt 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 cịn Người lập trình ln ln 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 45 https://fb.com/tailieudientucntt 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 cịn Người lập trình ln ln 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 46 https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 47 https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 48 https://fb.com/tailieudientucntt 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 CuuDuongThanCong.com © 2016 10 x = 10; *px = 10; **ppx = 10; ***pppx = 10; Lập trình C/C++ 49 https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 50 https://fb.com/tailieudientucntt 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 51 https://fb.com/tailieudientucntt ... = 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,... 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 Tốn CuuDuongThanCong.com © 2016 Lập trình C/C++ 37 https://fb.com/tailieudientucntt... (*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 Tốn } CuuDuongThanCong.com

Ngày đăng: 11/01/2020, 19:51

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan