Bài giảng Tin học II - Chương IX: Pointer - Trần Anh Dũng
Trong ngôn ngữ C, mỗi biến và chuỗi ký tự đều được lưu trữ
trong bộ nhớ và có địa chỉ riêng, địa chỉ này xác định vị trí của
chúng trong bộ nhớ Æ C đưa ra kiểu dữ liệu pointer (tạm dịch là
con trỏ) đ khai báo cho các bi n lưu địa chỉ.
Đây là một kiểu dữ liệu đặc biệt và được sử dụng nhiều trong
một chương trình C.
Một biến có kiểu pointer có thể lưu được dữ liệu trong nó, là địa
chỉ của một đối tượng đang khảo sát.
2/3/2009 CBGD: ThS.Trần Anh Dũng 1 Chương IX C B G D : ThS.Trần A nh D ũng POINTER 1 KHÁI NIỆM Trong ngôn ngữ C, mỗi biến và chuỗi ký tự đều được lưu trữ trong bộ nhớ và có địa chỉ riêng, địa chỉ này xác định vị trí của chúng trong bộ nhớÆ C đưa ra kiểu dữ liệu pointer (tạm dịch là ể ế CB G D : ThS.Trần A nh D ũng con trỏ) đ khai báo cho các bi n lưu địa chỉ. Đây là một kiểu dữ liệu đặc biệt và được sử dụng nhiều trong một chương trình C. Một biến có kiểu pointer có thể lưu được dữ liệu trong nó, là địa chỉ của một đối tượng đang khảo sát. Biến 2 Chuỗi Hàm 2/3/2009 CBGD: ThS.Trần Anh Dũng 2 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng Có nghĩa là khi khai báo biến 3 , hệ_số_a thì được cấp phát một vùng nhớ trong bộ nhớ máy tính. Địa chỉ đầu của vùng nhớ này chính là địa chỉ của biến hệ_số_a: &hệ_số_a THAO TÁC TRÊN POINTER ế ấ ế ằ CBG D : ThS.Trần A nh D ũng K t quả của phép toán l y địa chỉ của một bi n là một h ng pointer hằng trỏ đến biến đó, địa chỉ hằng này có thể được xem như một giá trị để gán vào biến pointer. Hằng pointer cũng có thể là tên mảng hoặc tên hàm. 4 2/3/2009 CBGD: ThS.Trần Anh Dũng 3 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 5 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 6 2/3/2009 CBGD: ThS.Trần Anh Dũng 4 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 7 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 8 2/3/2009 CBGD: ThS.Trần Anh Dũng 5 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 9 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 10 2/3/2009 CBGD: ThS.Trần Anh Dũng 6 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 11 THAO TÁC TRÊN POINTER Có thể cộng, trừ một pointer với một số nguyên (int, long,...). Kết quả là một pointer. Pointer có được từ phép cộng hoặc trừ trên, sẽ chỉ đến một đối tượ ới lệ h ới đối tượ ũ hầ tử ế tí h th b t CB G D : ThS.Trần A nh D ũng ng m c v ng c n p n , n u n eo y e thì đối tượng cũ lệch với đối tượng mới số byte bằng n lần kích thước byte của kiểu đối tượng mà con trỏ đang trỏ đến. 12 2/3/2009 CBGD: ThS.Trần Anh Dũng 7 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 13 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 14 2/3/2009 CBGD: ThS.Trần Anh Dũng 8 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 15 THAO TÁC TRÊN POINTER Phép trừ giữa hai pointer vẫn là một phép toán hợp lệ, kết quả là một trị thuộc kiểu int biểu thị khoảng cách (số phần tử) giữa hai pointer đó C B G D : ThS.Trần A nh D ũng 16 2/3/2009 CBGD: ThS.Trần Anh Dũng 9 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 17 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 18 2/3/2009 CBGD: ThS.Trần Anh Dũng 10 THAO TÁC TRÊN POINTER C cho phép khai báo một biến pointer là hằng hoặc đối tượng của một pointer là hằng. Lúc đó, việc gán, hoặc tăng giảm trị lưu trong pointer hằng là không hợp lệ, hoặc thay đổi đối tượng của pointer khi pointer được khai báo là chỉ đến một đối tượng hằng C B G D : ThS.Trần A nh D ũng đều bị C báo lỗi 19 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 20 2/3/2009 CBGD: ThS.Trần Anh Dũng 11 THAO TÁC TRÊN POINTER C B G D : ThS.Trần A nh D ũng 21 POINTER VÀ MẢNG C B G D : ThS.Trần A nh D ũng 22 2/3/2009 CBGD: ThS.Trần Anh Dũng 12 POINTER VÀ MẢNG C B G D : ThS.Trần A nh D ũng 23 POINTER VÀ MẢNG C B G D : ThS.Trần A nh D ũng 24 2/3/2009 CBGD: ThS.Trần Anh Dũng 13 POINTER VÀ MẢNG C B G D : ThS.Trần A nh D ũng 25 POINTER VÀ MẢNG Khai báo đối số của hàm, có thể khai báo đối số giả dưới dạng mảng: int a[] h ặ ó thể kh i bá dưới d i t CB G D : ThS.Trần A nh D ũng o c c a o ạng po n er: int *a 26 2/3/2009 CBGD: ThS.Trần Anh Dũng 14 ĐỐI SỐ CỦA HÀM LÀ POINTER – TRUYỀN ĐỐI SỐ THEO SỐ DẠNG THAM SỐ BIẾN C B G D : ThS.Trần A nh D ũng 27 ĐỐI SỐ CỦA HÀM LÀ POINTER – TRUYỀN ĐỐI SỐ THEO SỐ DẠNG THAM SỐ BIẾN C B G D : ThS.Trần A nh D ũng 28 2/3/2009 CBGD: ThS.Trần Anh Dũng 15 ĐỐI SỐ CỦA HÀM LÀ POINTER – TRUYỀN ĐỐI SỐ THEO SỐ DẠNG THAM SỐ BIẾN C B G D : ThS.Trần A nh D ũng Cách cũ Cách mới 29 ĐỐI SỐ CỦA HÀM LÀ POINTER – TRUYỀN ĐỐI SỐ THEO SỐ DẠNG THAM SỐ BIẾN C B G D : ThS.Trần A nh D ũng 30 2/3/2009 CBGD: ThS.Trần Anh Dũng 16 HÀM TRẢ VỀ POINTER VÀ MẢNG C B G D : ThS.Trần A nh D ũng 31 HÀM TRẢ VỀ POINTER VÀ MẢNG C B G D : ThS.Trần A nh D ũng Hàm lon_nhat() trả về một địa chỉ: ¾ Là địa chỉ của một int ¾ Hoặc địa chỉ của một mảng các int 32 Việc sử dụng địa chỉ theo đối tượng nào là do nơi gọi 2/3/2009 CBGD: ThS.Trần Anh Dũng 17 HÀM TRẢ VỀ POINTER VÀ MẢNG C B G D : ThS.Trần A nh D ũng 33 Pointer được trả qua lệnh return chính là tên hàm, là địa chỉ đầu mảng. Đối số thật đưa vào cho hàm là một địa chỉ của một biến int để nhận trị này CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 34 2/3/2009 CBGD: ThS.Trần Anh Dũng 18 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 35 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 36 2/3/2009 CBGD: ThS.Trần Anh Dũng 19 CHUỖI KÝ TỰ Khi nhập trị, hàm này đọc các ký tự đến khi nào gặp ký tự quy định hàng mới (tức ký tự '\n', tức khi ta ấn phím ENTER) thì kết thúc việc nhập C B G D : ThS.Trần A nh D ũng Hàm này trả về một pointer trỏ 37 đến chuỗi, pointer này chính là tên mảng, là đối số sau khi gán chuỗi CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 38 Lệnh gets hiểu Dang Thanh Tin là 1 chuỗi (không có dấu xuống hàng) Lệnh scanf hiểu Dang Thanh Tin là 3 chuỗi (do dấu khoảng trắng) 2/3/2009 CBGD: ThS.Trần Anh Dũng 20 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng Để xuất chuỗi, hai hàm thường hay được dùng: ¾ puts() ¾ printf() Cả hai hàm có prototype trong file stdio.h. 39 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 40 - 2/3/2009 CBGD: ThS.Trần Anh Dũng 21 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 41 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 42 2/3/2009 CBGD: ThS.Trần Anh Dũng 22 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 43 Chú ý, nếu chiều dài chuỗi đích không đủ để nhận hết dữ liệu từ chuỗi nguồn thì C vẫn thực hiện việc gán trị cho chuỗi đích mà không báo lỗi nào, tuy nhiên chương trình sẽ chạy sai cho các lệnh dưới hoặc không kết thúc được CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 44 2/3/2009 CBGD: ThS.Trần Anh Dũng 23 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 45 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 46 2/3/2009 CBGD: ThS.Trần Anh Dũng 24 CHUỖI KÝ TỰ C B G D : ThS.Trần A nh D ũng 47 POINTER VÀ VIỆC ĐỊNH VỊ BỘ NHỚ ĐỘNG C cho phép khai báo các biến động, các biến này khi cần thì xin chỗ, không cần thì giải phóng vùng nhớ cho chương trình sử dụng vào mục đích khác. ế ấ CB G D : ThS.Trần A nh D ũng Các bi n động này được c p phát trong vùng nhớ heap, là vùng đáy bộ nhớ, và được quản lý bởi các biến pointer 48 Nếu hàm này xin được khối bộ nhớ cần thiết thì chúng sẽ trả về một pointer trỏ đến đầu khối này Nếu không xin được khối bộ nhớ cần thiết, hàm sẽ về trị là một con trỏ NULL 2/3/2009 CBGD: ThS.Trần Anh Dũng 25 POINTER VÀ VIỆC ĐỊNH VỊ BỘ NHỚ ĐỘNG C B G D : ThS.Trần A nh D ũng 49 POINTER VÀ VIỆC ĐỊNH VỊ BỘ NHỚ ĐỘNG C B G D : ThS.Trần A nh D ũng 50 2/3/2009 CBGD: ThS.Trần Anh Dũng 26 POINTER VÀ VIỆC ĐỊNH VỊ BỘ NHỚ ĐỘNG C B G D : ThS.Trần A nh D ũng 51 MẢNG CÁC POINTER C B G D : ThS.Trần A nh D ũng 52 2/3/2009 CBGD: ThS.Trần Anh Dũng 27 MẢNG CÁC POINTER C B G D : ThS.Trần A nh D ũng 53 MẢNG CÁC POINTER C B G D : ThS.Trần A nh D ũng 54 2/3/2009 CBGD: ThS.Trần Anh Dũng 28 MẢNG CÁC POINTER C B G D : ThS.Trần A nh D ũng 55 MẢNG CÁC POINTER C B G D : ThS.Trần A nh D ũng 56 2/3/2009 CBGD: ThS.Trần Anh Dũng 29 MẢNG CÁC POINTER C B G D : ThS.Trần A nh D ũng 57 MẢNG CÁC POINTER C B G D : ThS.Trần A nh D ũng 58 2/3/2009 CBGD: ThS.Trần Anh Dũng 30 POINTER CỦA POINTER C B G D : ThS.Trần A nh D ũng 59 POINTER CỦA POINTER C B G D : ThS.Trần A nh D ũng 60 2/3/2009 CBGD: ThS.Trần Anh Dũng 31 POINTER CỦA POINTER C B G D : ThS.Trần A nh D ũng 61 ĐỐI SỐ CỦA HÀM MAIN C B G D : ThS.Trần A nh D ũng 62 2/3/2009 CBGD: ThS.Trần Anh Dũng 32 ĐỐI SỐ CỦA HÀM MAIN C B G D : ThS.Trần A nh D ũng 63 ĐỐI SỐ CỦA HÀM MAIN C B G D : ThS.Trần A nh D ũng 64 2/3/2009 CBGD: ThS.Trần Anh Dũng 33 ĐỐI SỐ CỦA HÀM MAIN C B G D : ThS.Trần A nh D ũng 65 ĐỐI SỐ CỦA HÀM MAIN C B G D : ThS.Trần A nh D ũng 66 2/3/2009 CBGD: ThS.Trần Anh Dũng 34 POINTER TRỎ ĐẾN HÀM C B G D : ThS.Trần A nh D ũng 67 POINTER TRỎ ĐẾN HÀM C B G D : ThS.Trần A nh D ũng 68 2/3/2009 CBGD: ThS.Trần Anh Dũng 35 ỨNG DỤNG • Danh sách liên kết là stack Đưa một phần tử vào stack – thao tác push Lấy một phần tử từ stack – thao tác pop C B G D : ThS.Trần A nh D ũng Xem stack Khởi động stack • Danh sách liên kết là queue Thêm một thông tin vào queue – thao tác add Lấy một thông tin khỏi queue – thao tác delete Xem trị hiện hành của phần tử đầu của queue 69 Khởi động queue BÀI TẬP C B G D : ThS.Trần A nh D ũng 70
File đính kèm:
- bai_giang_lap_trinh_c_chuong_ix_pointer_tran_anh_dung.pdf