Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 48 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
48
Dung lượng
3,01 MB
Nội dung
Bộ môn Công nghệ phần mềm Khoa Công nghệ thông tin Trường Đại học Khoa học Tự nhiên KỸ THUẬT LẬP TRÌNH ThS Đặng Bình Phương dbphuong@fit.hcmus.edu.vn DỮ LIỆU KIỂU CON TRỎ (NÂNG CAO) VC VC && BB BB Nội dung Con trỏ cấp 2 Con trỏ mảng nhiều chiều Mảng trỏ Con trỏ hàm Dữ liệu kiểu trỏ (nâng cao) VC VC && BB BB Con trỏ cấp (con trỏ đến trỏ) Đặt vấn đề void CapPhat(int *p, int n) { p = (int *)malloc(n * sizeof(int)); } void main() { int *a = NULL; CapPhat(a, 2); // a = NULL } Làm thay đổi giá trị trỏ (không phải giá trị mà trỏ đến) sau gọi hàm? Dữ liệu kiểu trỏ (nâng cao) VC VC && BB BB Con trỏ cấp int *p int n 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 … 22 N UU 00 LL 00 LL 02 22 N 00 00 00 00 0200 0000 0000 00 CapPhat int int *p *p NULL … int int nn 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … N N UU LL LL int *a = NULL … Dữ liệu kiểu trỏ (nâng cao) VC VC && BB BB Con trỏ cấp Giải pháp Sử dụng tham chiếu int *&p (trong C++) void CapPhat(int *&p, int n) { p = (int *)malloc(n * sizeof(int)); } Không thay đổi trực tiếp tham số mà trả int* CapPhat(int n) { int *p = (int *)malloc(n * sizeof(int)); return p; } Dữ liệu kiểu trỏ (nâng cao) VC VC && BB BB Con trỏ cấp Giải pháp Sử dụng trỏ p trỏ đến trỏ a Hàm thay đổi giá trị trỏ â gián tiếp thông qua trỏ p void CapPhat(int **p, int n) { *p = (int *)malloc(n * sizeof(int)); } void main() { int *a = NULL; CapPhat(&a, 4); } Dữ liệu kiểu trỏ (nâng cao) VC VC && BB BB Con trỏ cấp int **p int n 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 … 0B 0B00 0000 0000 0002 0200 0000 0000 00 CapPhat int int **p **p 0B … int int nn 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 22 N UU 00 LL 00 LL 22 N 00 00 00 00 int *a = NULL … Dữ liệu kiểu trỏ (nâng cao) VC VC && BB BB Con trỏ cấp Lưu ý int x = 12; int *ptr = &x; int k = &x; ptr = k; // OK // Lỗi int **ptr_to_ptr = &ptr; int **ptr_to_ptr = &x; // OK // Lỗi **ptr_to_ptr = 12; *ptr_to_ptr = 12; // OK // Lỗi printf(“%d”, ptr_to_ptr); printf(“%d”, *ptr_to_ptr); printf(“%d”, **ptr_to_ptr); // Địa ptr // Giá trị ptr // Giá trị x Dữ liệu kiểu trỏ (nâng cao) VC VC && BB BB Con trỏ mảng chiều int a[3][4]; a 10 11 int a 2 int[4] Dữ liệu kiểu trỏ (nâng cao) VC VC && BB BB Con trỏ mảng chiều Hướng tiếp cận Các phần tử tạo thành mảng chiều Sử dụng trỏ int * để duyệt mảng chiều int *p = (int *)a +1 10 11 int a[3][4] Dữ liệu kiểu trỏ (nâng cao) 10 VC VC && BB BB Con trỏ hàm Mảng trỏ hàm typedef (*PhepToan)(int, int); void main() { int (*array1[2])(int, int); PhepToan array2[2]; // tường minh // kô tường minh array1[0] = array2[1] = &Cong; array1[1] = array2[0] = &Tru; printf(“%d\n”, printf(“%d\n”, printf(“%d\n”, printf(“%d\n”, (*array1[0])(1, 2)); array1[1](1, 2)); array2[0](1, 2)); array2[1](1, 2)); } Dữ liệu kiểu trỏ (nâng cao) 34 VC VC && BB BB Con trỏ hàm Lưu ý Không quên dấu () khai báo trỏ hàm • int (*PhepToan)(int x, int y); • int *PhepToan(int x, int y); Có thể bỏ tên biến tham số khai báo trỏ hàm • int (*PhepToan)(int x, int y); • int (*PhepToan)(int, int); Dữ liệu kiểu trỏ (nâng cao) 35 VC VC && BB BB Bài tập Câu 1: Ta khai báo sử dụng biến trỏ đến cấp thứ mấy? Câu 2: Có khác trỏ đến chuỗi trỏ đến mảng ký tự không? Dữ liệu kiểu trỏ (nâng cao) 36 VC VC && BB BB Bài tập Câu 3: Nếu không sử dụng kiến thức nâng cao trỏ, ta giải số tốn khơng? Câu 4: Hãy nêu vài ứng dụng trỏ hàm Dữ liệu kiểu trỏ (nâng cao) 37 VC VC && BB BB Bài tập Câu 5: Viết đoạn lệnh khai báo biến x kiểu float, khai báo khởi tạo trỏ px đến biến x khai báo khởi tạo trỏ ppx đến trỏ px Câu 6: Ta muốn gán 100 cho x thông qua trỏ ppx biểu thức gán “ppx = 100;” có khơng? Dữ liệu kiểu trỏ (nâng cao) 38 VC VC && BB BB Bài tập Câu 7: Giả sử ta khai báo mảng array chiều: int array[2][3][4] Cho biết cấu trúc mảng trình biên dịch C Câu 8: Cho biết array[0][0] có nghĩa gì? Dữ liệu kiểu trỏ (nâng cao) 39 VC VC && BB BB Bài tập Câu 9: Xét xem biểu thức so sánh sau a array[0][0] == &array[0][0][0]; b array[0][1] == array[0][0][1]; c array[0][1] == &array[0][1][0]; Câu 10: Viết nguyên mẫu hàm nhận mảng trỏ đến kiểu char làm đối số, giá trị trả có kiểu void Dữ liệu kiểu trỏ (nâng cao) 40 VC VC && BB BB Bài tập Câu 11: Theo cách viết câu 10, ta biết số phần tử mảng truyền kô? Câu 12: Con trỏ đến hàm gì? Câu 13: Viết khai báo trỏ đến hàm mà hàm có giá trị trả kiểu char, nhận đối số mảng trỏ đến kiểu char Dữ liệu kiểu trỏ (nâng cao) 41 VC VC && BB BB Bài tập Câu 13: Ta viết khai báo trỏ câu 12 có khơng? char *ptr(char *x[]); Câu 14: Cho biết ý nghĩa khai báo sau: a int *var1; b int var2; c int **var3; Dữ liệu kiểu trỏ (nâng cao) 42 VC VC && BB BB Bài tập Câu 15: Cho biết ý nghĩa khai báo sau: a int a[3][12]; b int (*b)[12]; c int *c[12]; Dữ liệu kiểu trỏ (nâng cao) 43 VC VC && BB BB Bài tập Câu 16: Cho biết ý nghĩa khai báo sau: a char *z[10]; b char *y(int field); c char (*x)(int field); Dữ liệu kiểu trỏ (nâng cao) 44 VC VC && BB BB Bài tập Câu 17: Viết khai báo trỏ func đến hàm nhận đối số số nguyên trả giá trị kiểu float Câu 18: Viết khai báo mảng trỏ đến hàm Các hàm nhận chuỗi ký tự làm tham số trả giá trị kiểu nguyên Ta sử dụng mảng để làm gì? Dữ liệu kiểu trỏ (nâng cao) 45 VC VC && BB BB Bài tập Câu 19: Viết câu lệnh khai báo mảng 10 trỏ đến kiểu char Câu 20: Tìm lỗi sai đoạn lệnh sau int x[3][12]; int *ptr[12]; ptr = x; Dữ liệu kiểu trỏ (nâng cao) 46 VC VC && BB BB Bài tập Câu 21: Viết chương trình khai báo mảng hai chiều có 12x12 phần tử kiểu char Gán ký tự ‘X’ cho phần tử mảng Sử dụng trỏ đến mảng để in giá trị phần tử mảng lên hình dạng lưới Câu 22: Viết chương trình khai báo mảng 10 trỏ đến kiểu float, nhận 10 số thực từ bàn phím, xếp lại in hình dãy số xếp Câu 23: Sửa lại tập 22 để người sử dụng lựa chọn cách xếp theo thứ tự tăng hay giảm dần Dữ liệu kiểu trỏ (nâng cao) 47 VC VC && BB BB Bài tập Câu 24: Chương trình cho phép người dùng nhập dịng văn từ bàn phím đến nhập dịng trống Chương trình xếp dòng theo thứ tự alphabet hiển thị chúng hình Câu 25: Sử dụng trỏ hàm để viết hàm xếp sau Tăng dần Giảm dần Dương giảm âm tăng, cuối số 48 … Dữ liệu kiểu trỏ (nâng cao)