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

Nội dung

- 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

- Con trỏ và cấu trúc, toán tử - Y

- Các chủ đề nâng cao với con trỏ

• Thứ tự đánh giá

và ++,

- Con trỏ và const - Con trỏ đến con trỏ

- Con trỏ void

pdf 28 trang xuanthi 27/12/2022 2820
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 7: Con trỏ - Trần Quang", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_chuong_7_con_tro_tran_quang.pdf

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

  1. 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 với con trỏ  Toán tử &  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
  2. 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
  3. 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: Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 6
  4. Ứ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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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 int *p = a; chỉ phần tử đầu tiên của mảng 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
  10. 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
  11. Cấp phát bộ nhớ động  Hàm xin cấp phát bộ nhớ  malloc  calloc  realloc  Hàm giải phóng bộ nhớ  free Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 22
  12. Cấp phát bộ nhớ động int *p1; float *p2; int n = 100; xin cấp phát bộ nhớ p1 = (int*) malloc (n * sizeof(int)); p2 = (float*) malloc (n * sizeof(float)); free(p1); free(p2); Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 24
  13. Cấp phát bộ nhớ động  Hàm malloc trả về NULL nếu không cấp phát được vùng nhớ. Do đó, nên kiểm tra bằng lệnh if trước khi xử lý tiếp.  Ví dụ: int n = 100; int *p1 = (int*) malloc (n * sizeof(int)); if (p1 == NULL) { printf ("Khong cap phat duoc!\n"); exit(1); } else { // Tiếp tục xử lý free(p1); } Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 26
  14. Con trỏ và cấu trúc Truy cập biến thành viên cấu trúc qua con trỏ (*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; p_ptr : biến con trỏ chứa địa chỉ của một cấu trúc Point3D (*p_ptr) : Vùng nhớ của cấu trúc Point3D (*p_ptr).x : Vùng nhớ chứa biến x của cấu trúc Point3D p_ptr -> x : Vùng nhớ chứa biến x của cấu trúc Point3D, truy cập thông qua toán tử -> từ con trỏ p_ptr Trần Quang Kỹ thuật lập trình Chương 06: Con trỏ © 2016 28