Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 44 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
44
Dung lượng
3,22 MB
Nội dung
Trường Đại học Khoa học Tự nhiên Khoa Công nghệ thông tin Bộ môn Tinhọccơsở 1 Đặng Bình Phương dbphuong@fit.hcmuns.edu.vn TINHỌCCƠSỞ 2 DỮLIỆUKIỂUCONTRỎNÂNGCAO VC VC & & BB BB 22 Nội dung Tinhọccơsở 2 - Đặng Bình Phương Contrỏ cấp 21 Contrỏ và mảng nhiều chiều2 Mảng con trỏ3 Contrỏ hàm4 VC VC & & BB BB 33 Contrỏ cấp 2 (con trỏ đến con trỏ) Đặt vấn đề Làm sao thay đổi giá trị của contrỏ (không phải giá trị mà nó trỏ đến) sau khi gọi hàm? Tinhọccơsở 2 - Đặng Bình Phương void CapPhat(int *p, int n) { p = (int *)malloc(n * sizeof(int)); } void main() { int *a = NULL; CapPhat(a, 2); // a vẫn = NULL } VC VC & & BB BB 44 NULL Contrỏ cấp 2 Tinhọccơsở 2 - Đặng Bình Phương …… int *a = NULL 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 int *p int *p int n int nCapPhat …… 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 int *p N N U U L L L L N N U U L L L L 2 02 02 00 00 00 00 00 00 int n 22 22 00 00 00 00 00 00 VC VC & & BB BB 55 Contrỏ cấp 2 Giải pháp Sử dụng tham chiếu int *&p (trong C++) Không thay đổi trực tiếp tham số mà trả về Tinhọccơsở 2 - Đặng Bình Phương int* CapPhat(int n) { int *p = (int *)malloc(n * sizeof(int)); return p; } void CapPhat(int *&p, int n) { p = (int *)malloc(n * sizeof(int)); } VC VC & & BB BB 66 Contrỏ cấp 2 Giải pháp Sử dụng contrỏ p trỏ đến contrỏ a này. Hàm sẽ thay đổi giá trị của contrỏ â gián tiếp thông qua contrỏ p. Tinhọccơsở 2 - Đặng Bình Phương void CapPhat(int **p, int n) { *p = (int *)malloc(n * sizeof(int)); } void main() { int *a = NULL; CapPhat(&a, 4); } VC VC & & BB BB 77 0B Contrỏ cấp 2 Tinhọccơsở 2 - Đặng Bình Phương …… int *a = NULL 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 int **p int **p int n int nCapPhat …… 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 int **p 0B 0B 00 00 00 00 00 00 N N U U L L L L 2 02 02 00 00 00 00 00 00 int n 22 22 00 00 00 00 00 00 VC VC & & BB BB 88 Contrỏ cấp 2 Lưu ý Tinhọccơsở 2 - Đặng Bình Phương int x = 12; int *ptr = &x; // OK int k = &x; ptr = k; // Lỗi int **ptr_to_ptr = &ptr; // OK int **ptr_to_ptr = &x; // Lỗi **ptr_to_ptr = 12; // OK *ptr_to_ptr = 12; // Lỗi printf(“%d”, ptr_to_ptr); // Địa chỉ ptr printf(“%d”, *ptr_to_ptr); // Giá trị ptr printf(“%d”, **ptr_to_ptr); // Giá trị x VC VC & & BB BB 99 21 Contrỏ và mảng 2 chiều Tinhọccơsở 2 - Đặng Bình Phương 0 1 2 0 1 2 3 4 7 85 6 9 a 10 11 int a[3][4]; int 0 1 2 0 1 2 3 a int[4] VC VC & & BB BB 1010 Contrỏ và mảng 2 chiều Hướng tiếp cận 1 Các phần tử tạo thành mảng 1 chiều Sử dụng contrỏ int * để duyệt mảng 1 chiều Tinhọccơsở 2 - Đặng Bình Phương 0 1 2 3 4 7 85 6 9 int a[3][4] 10 11 int *p = (int *)a +1 [...]... // Không trỏ đến đâu cả Tin họccơsở 2 - Đặng Bình Phương 28 VC VC & & BB BB Contrỏ hàm So sánh contrỏ hàm if { (tinhtoan != NULL) if (tinhtoan == &Cong) printf( Contrỏ đến hàm Cong.”); else if (tinhtoan == &Tru) printf( Contrỏ đến hàm Tru.”); else printf( Contrỏ đến hàm khác.”); } else printf( Contrỏ chưa được khởi tạo!”); Tin họccơsở 2 - Đặng Bình Phương 29 VC VC & & BB BB Contrỏ hàm ... pt3; // Không tường minh Tin họccơsở 2 - Đặng Bình Phương 27 VC VC & & BB BB Contrỏ hàm Gán giá trị cho contrỏ hàm = ; = &; Hàm được gán phải cùng dạng (vào, ra) Ví dụ int Cong(int x, int y); // Hàm int Tru(int x, int y); // Hàm int (*tinhtoan)(int x, int y); // Contrỏ hàm tinhtoan = Cong; tinhtoan = &Tru; tinhtoan = NULL; // Dạng ngắn... cận 2 Truyền mảng cho hàm Truyền địa chỉ phần tử đầu tiên cho hàm Khai báo contrỏ rồi gán địa chỉ mảng cho contrỏ này để nó trỏ đến mảng Contrỏ này phải cùng kiểu với biến mảng, tức là contrỏ đến vùng nhớ n phần tử (mảng) Cú pháp (* )[ . Đại học Khoa học Tự nhiên Khoa Công nghệ thông tin Bộ môn Tin học cơ sở 1 Đặng Bình Phương dbphuong@fit.hcmuns.edu.vn TIN HỌC CƠ SỞ 2 DỮ LIỆU KIỂU CON TRỎ. 66 Con trỏ cấp 2 Giải pháp Sử dụng con trỏ p trỏ đến con trỏ a này. Hàm sẽ thay đổi giá trị của con trỏ â gián tiếp thông qua con trỏ p. Tin học cơ sở