Bài giảng Nhập môn về lập trình (C1) - Chương 8: Con trỏ (Pointer)

pdf 17 trang Gia Huy 17/05/2022 2040
Bạn đang xem tài liệu "Bài giảng Nhập môn về lập trình (C1) - Chương 8: Con trỏ (Pointer)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_nhap_mon_ve_lap_trinh_c1_chuong_8_con_tro_pointer.pdf

Nội dung text: Bài giảng Nhập môn về lập trình (C1) - Chương 8: Con trỏ (Pointer)

  1. Chương 8 Con trỏ(Pointer) Presenter: Nhập môn về lập trình (C8) Slide 1
  2. Learning outcomes L.O.6.1 – Khai báo được con trỏ. L.O.6.2 – Truy xuất được dữ liệu qua con trỏ. L.O.6.3 – Giải thích được cách cấp phát bộ nhớ động. L.O.6.4 – Sử dụng được các phép toán trên con trỏ. L.O.6.5 – Sử dụng được con trỏ của con trỏ khác. L.O.6.6 – Dùng được con trỏ với kiểu cấu trúc. L.O.6.7 – Hiểu được sự liên quan giữa con trỏ và mảng. Nhập môn về lập trình (C8) Slide 2
  3. Kiểu con trỏ(pointer) Định nghĩa  Kiểu con trỏ là kiểu biến đặc biệt chỉ dùng để giữ địa chỉ (tham khảo). Dùng dấu * để định nghĩa. Ví dụ:  Toán tửtử '&''&' chocho phépphép gágánn địađịa chỉchỉ củacủa mộtmột biến vào con trỏ như sau : = & Ví dụ :  Con trỏ biến được dùng lưu giữ địa chỉ các biến và cho phép truy xuất biến một cách gián tiếp.  Ứng dụng thường dùng là tham số hàm. Nhập môn về lập trình (C8) Slide 3
  4. Kiểu con trỏ(pointer) Ví dụ 1 Nhập môn về lập trình (C8) Slide 4
  5. Con trỏ biến cấu trúc Tham số hàm kiểu con trỏ cấu trúc Nhập môn về lập trình (C8) Slide 5
  6. Pointer và cấp phát động Ý tưởng  Kiểu pointer rất thích hợp để quản lý dữ liệu có độ lớn chưa biết trước tại thời điểm lập trình.  Ví dụ : double param[100][100]; // cấp phát 10.000 phần tử kiểu double hay double param; // chỉ cấp phát 1 pointer (double ) (double) (double*) Nhập môn về lập trình (C8) Slide 6
  7. Pointer và cấp phát động hiện thực  Sau khi có con trỏ đến ma trận, để có ma trận thực sự, ta dùng hàm malloc (memory allocation) trong thư viện malloc.lib (#include malloc.h) để sinh ra các vector và phần tử.  Ví dụ : • Sinh ra m vector (m chưa biết trước) printf ("Nhap M: "); scanf_s("%d", &m); param = (double ) malloc(m * sizeof(double*)); • Sinh ra n phần tử trong mỗi vector (n chưa biết trước) printf ("Nhap N: "); scanf_s("%d", &n); for (i = 0; i < m; i++) param[i] = (double*) malloc(n * sizeof(double));  Chú ý toán tử sizeof(kiểu) trả về kích thước kiểu cần cấp phát trong bộ nhớ. Nhập môn về lập trình (C8) Slide 7
  8. Pointer và cấp phát động Ví dụ Nhập môn về lập trình (C8) Slide 8
  9. Ví dụthêm vềcon trỏ  int* pi; // pointer to int  char ppc ; // pointer to pointer to char  int* ap[15]; // array of 15 pointers to ints  int (*fp)(char*); // pointer to function taking a char* // argument; returns an int  int* f(char*); // function taking a char* argument; // returns a pointer to int Nhập môn về lập trình (C8) Slide 9
  10. Pointers to strings Đúng hay sai ?  char *psz; psz = “File not ready”;  char *psz = “File not ready”; char pszarray[ ] = “Drive not ready”;  char pszarray[16]; pszarray = “Drive not ready”;  char *psz; scanf_s(“%s”,psz); Nhập môn về lập trình (C8) Slide 10
  11. Pointer arithmetic and arrays Ví dụ 1 Nhập môn về lập trình (C8) Slide 11
  12. Pointer arithmetic and arrays Ví dụ 2 Nhập môn về lập trình (C8) Slide 12
  13. Con trỏ và hằng void f1 (char *p) { char s[] = "Gorm"; const char* pc=s ; // con trỏ đến một hằng pc[3]=´g´; // sai: không thể thay đổi nội dung pc=p; // ok: có thể thay đổi địa chỉ char *const cp=s; // hằng con trỏ cp[3]=´a´; // ok: có thể thay đổi nội dung cp=p; // sai: không thể thay đổi địa chỉ const char *const cpc=s; // hằng con trỏ đến một hằng cpc[3]=´a´; // sai: không thể thay đổi nội dung cpc=p ; // sai: lẫn địa chỉ } *const là toán tử khai báo hằng con trỏ (không có toán tử const*). Nhập môn về lập trình (C8) Slide 13
  14. Phép toán trên pointer Kết quả nhận được là gì?  Thường dùng (pointer + integer)  Có thể trừ số nguyên vào con trỏ (pointer - integer)  Có thể trừ hai con trỏ (pointer - pointer)  Có thể so sánh hai con trỏ với nhau ( =) Nhập môn về lập trình (C8) Slide 14
  15. Con trỏ đến hàm Nhập môn về lập trình (C8) Slide 15
  16. Dãy con trỏ hàm Khái niệm  Dãy con trỏ hàm thích hợp với các bài toán xử lý theo sơ đồ chuyển trạng thái. Gọi hàm xuly[0] () 00 Nhập số N In kết quả Tính toán 01 02 Gọi hàm xuly[2] () Gọi hàm xuly[1] () Nhập môn về lập trình (C8) Slide 16
  17. Dãy con trỏ hàm Ví dụ  Sửa lại hàm tinhdiem_tk() để dùng dãy con trỏ hàm.  Chương trình dùng dãy con trỏ hàm Nhập môn về lập trình (C8) Slide 17