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.

pdf35 trang | Chuyên mục: C/C++ | Chia sẻ: yen2110 | Lượt xem: 523 | Lượt tải: 0download
Tóm tắt nội dung Bài giảng Tin học II - Chương IX: Pointer - Trần Anh Dũng, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
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:

  • pdfbai_giang_lap_trinh_c_chuong_ix_pointer_tran_anh_dung.pdf