Bài giảng: Dữ liệu kiểu con trỏ

Để tiết kiệm bộ nhớ, ngay khi chương trình đang làm việc, người lập trình có thể yêu cầu cấp phát bộ nhớ cho các biến, điều này gọi là cấp phát bộ nhớ động. Cấp phát bộ nhớ động được thực hiện thông qua biến con trỏ. Muốn có biến con trỏ ta phải định nghĩa kiểu con trỏ. Kiểu dữ liệu con trỏ-biến con trỏ: Con trỏ có định kiểu: Kiểu con trỏ là một kiểu dữ liệu đặc biệt dùng để biểu diễn các địa chỉ. Kiểu con. | NHẬP MÔN LẬP TRÌNH DỮ LIỆU KIỂU CON TRỎ (NÂNG CAO) Nội dung Dữ liệu kiểu con trỏ (nâng cao) Con trỏ cấp 2 1 Con trỏ và mảng nhiều chiều 2 Mảng con trỏ 3 Con trỏ hàm 4 Con trỏ cấp 2 (con trỏ đến con trỏ) Đặt vấn đề Làm sao thay đổi giá trị của con trỏ (không phải giá trị mà nó trỏ đến) sau khi gọi hàm? Dữ liệu kiểu con trỏ (nâng cao) void CapPhat(int *p, int n) { p = (int *)malloc(n * sizeof(int)); } void main() { int *a = NULL; CapPhat(a, 2); // a vẫn = NULL } NULL Con trỏ cấp 2 Dữ liệu kiểu con trỏ (nâng cao) int *a = NULL 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 int *p int n CapPhat 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 int *p N U L L N U L L 2 02 00 00 00 int n 22 00 00 00 Con trỏ 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ề Dữ liệu kiểu con trỏ (nâng cao) 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)); } | NHẬP MÔN LẬP TRÌNH DỮ LIỆU KIỂU CON TRỎ (NÂNG CAO) Nội dung Dữ liệu kiểu con trỏ (nâng cao) Con trỏ cấp 2 1 Con trỏ và mảng nhiều chiều 2 Mảng con trỏ 3 Con trỏ hàm 4 Con trỏ cấp 2 (con trỏ đến con trỏ) Đặt vấn đề Làm sao thay đổi giá trị của con trỏ (không phải giá trị mà nó trỏ đến) sau khi gọi hàm? Dữ liệu kiểu con trỏ (nâng cao) void CapPhat(int *p, int n) { p = (int *)malloc(n * sizeof(int)); } void main() { int *a = NULL; CapPhat(a, 2); // a vẫn = NULL } NULL Con trỏ cấp 2 Dữ liệu kiểu con trỏ (nâng cao) int *a = NULL 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 int *p int n CapPhat 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 int *p N U L L N U L L 2 02 00 00 00 int n 22 00 00 00 Con trỏ 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ề Dữ liệu kiểu con trỏ (nâng cao) 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)); } 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. Dữ liệu kiểu con trỏ (nâng cao) void CapPhat(int **p, int n) { *p = (int *)malloc(n * sizeof(int)); } void main() { int *a = NULL; CapPhat(&a, 4); } 0B Con trỏ cấp 2 Dữ liệu kiểu con trỏ (nâng cao) int *a = NULL 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 int **p int n CapPhat 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 int **p 0B 00 00 00 N U L L 2 02 00 00 00 int n 22 00 00 00 Con trỏ cấp 2 Lưu ý Dữ liệu kiểu con trỏ (nâng cao) 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 2 1 Con trỏ và mảng 2 chiều Dữ liệu kiểu con trỏ (nâng cao) 0 1 2 0 1 2 3 4 7 8 5 6 9 a 10 11 int a[3][4]; int 0 1 2 0

Không thể tạo bản xem trước, hãy bấm tải xuống
TỪ KHÓA LIÊN QUAN
TÀI LIỆU MỚI ĐĂNG
Đã phát hiện trình chặn quảng cáo AdBlock
Trang web này phụ thuộc vào doanh thu từ số lần hiển thị quảng cáo để tồn tại. Vui lòng tắt trình chặn quảng cáo của bạn hoặc tạm dừng tính năng chặn quảng cáo cho trang web này.