Tải bản đầy đủ (.pdf) (18 trang)

Chương 12: Pointer pot

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.18 MB, 18 trang )

10/26/2009
CBGD: ThS.Trần Anh Dũng
1
CBGD: Th
S
Chương 12
POINTER
S
.Trần Anh Dũng
1
POINTER
KHÁI NIỆM
CBGD: ThS.T
r
Trong ngôn ngữ C, mỗibiếnvàchuỗikýtựđều đượclưutrữ
trong bộ nhớ và có địachỉ riêng, địachỉ này xác định vị trí của
chúng trong bộ nhớ Æ C đưarakiểudữ liệu pointer (tạmdịch là
con trỏ) để khai b áo cho các biếnlưu địachỉ.
Đây là mộtkiểudữ liệu đặcbiệtvàđượcsử dụng nhiềutrong
mộtchương trình C.
Một
biế
ó
kiể
it
ó
thể
l
đ
dữ
liệ


t
ó

đị
2
r
ần Anh Dũng
Một
biế
nc
ó
kiể
u
p
o
i
n
t
e
r
c
ó
thể
l
ư
u
đ
ược
dữ
liệ

u
t
rong n
ó
,

đị
a
chỉ củamột đốitượng đang khảosát.
Biến
Chuỗi
Hàm
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
3
r
ần Anh Dũng
Có nghĩa là khi khai báo, biến
hệ_số_a thì đượccấp phát một
vùng nhớ trong bộ nhớ máy
tính. Địachỉđầucủavùngnhớ
này chính là địachỉ củabiến
hệ_số_a: &hệ_số_a
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
Kếtquả của phép toán lấy địachỉ củamộtbiếnlàmộthằng
pointer hằng trỏđếnbiến đó, địachỉ hằng này có thểđược
xem như một giá trịđểgán vào biến pointer.



4
r
ần Anh Dũng
H

ng
p
ointe
r
cũng có th

là tên mảng hoặctênhà
m
.
10/26/2009
CBGD: ThS.Trần Anh Dũng
2
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
5
r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
6
r

ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
7
r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
8
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
3
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
9
r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
10
r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T

r
11
r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
Có thể cộng, trừ một pointer vớimộtsố nguyên (int, long, ).
Kếtquả là một pointer.
Pointer có đượctừ phép cộng hoặctrừ trên, sẽ chỉđếnmột đối
tượng mớilệch với đốitượng cũ nphầntử,nếu tính theo byte
thì đốitượng cũ lệch với đốitượng mớisố byte bằng n lần
kích thước byte củakiểu đốitượng mà con trỏđang trỏđế
n.
12
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
4
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
13
r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
14

r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
15
r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
Phép trừ giữa hai pointer vẫnlàmột phép toán hợplệ,kếtquả
là mộttrị thuộckiểu int biểuthị khoảng cách (số phầntử)giữa
hai pointer đó
16
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
5
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
17
r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
18

r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
C cho phép khai báo mộtbiến pointer là hằng hoặc đốitượng của
một pointer là hằng.Lúcđó, việcgán,hoặctăng giảmtrị lưu
trong pointer hằng là không hợplệ,hoặcthayđổi đốitượng của
pointer khi pointer được khai báo là chỉđếnmột đốitượng hằng
đềubị Cbáolỗi
19
r
ần Anh Dũng
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
20
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
6
THAO TÁC TRÊN POINTER
CBGD: ThS.T
r
21
r
ần Anh Dũng
POINTER VÀ MẢNG
CBGD: ThS.T

r
22
r
ần Anh Dũng
POINTER VÀ MẢNG
CBGD: ThS.T
r
23
r
ần Anh Dũng
POINTER VÀ MẢNG
CBGD: ThS.T
r
24
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
7
POINTER VÀ MẢNG
CBGD: ThS.T
r
25
r
ần Anh Dũng
POINTER VÀ MẢNG
CBGD: ThS.T
r
Khai báo đốisố củahàm,cóthể khai báo đốisố giả dướidạng
mảng:

int a[]
hoặccóthể khai báo dướidạng pointer:
int *a
26
r
ần Anh Dũng
ĐỐI SỐ CỦA HÀM LÀ POINTER –
TRUYỀN ĐỐI SỐ THEO SỐ DẠNG
THAM SỐ BIẾN
CBGD: ThS.T
r
27
r
ần Anh Dũng
ĐỐI SỐ CỦA HÀM LÀ POINTER –
TRUYỀN ĐỐI SỐ THEO SỐ DẠNG
THAM SỐ BIẾN
CBGD: ThS.T
r
28
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
8
ĐỐI SỐ CỦA HÀM LÀ POINTER –
TRUYỀN ĐỐI SỐ THEO SỐ DẠNG
THAM SỐ BIẾN
CBGD: ThS.T
r

Cách

Cách
mới
29
r
ần Anh Dũng
Cách

Cách
mới
ĐỐI SỐ CỦA HÀM LÀ POINTER –
TRUYỀN ĐỐI SỐ THEO SỐ DẠNG
THAM SỐ BIẾN
CBGD: ThS.T
r
30
r
ần Anh Dũng
HÀM TRẢ VỀ POINTER VÀ MẢNG
CBGD: ThS.T
r
31
r
ần Anh Dũng
HÀM TRẢ VỀ POINTER VÀ MẢNG
CBGD: ThS.T
r
32
r

ần Anh Dũng
Hàm lon_nhat() trả về một địachỉ:
¾ Là địachỉ củamộtint
¾ Hoặc địachỉ củamộtmảng các int
Việcsử dụng địachỉ theo đốitượng nào là do nơigọi
10/26/2009
CBGD: ThS.Trần Anh Dũng
9
HÀM TRẢ VỀ POINTER VÀ MẢNG
CBGD: ThS.T
r
33
r
ần Anh Dũng
Pointer đượctrả qua lệnh return chính
là tên hàm, là địachỉđầumảng.
Đốisố th ật đưa vào cho hàm là một
địachỉ củamộtbiếnintđể nhậntrị
này
CHUỖI KÝ TỰ
CBGD: ThS.T
r
34
r
ần Anh Dũng
CHUỖI KÝ TỰ
CBGD: ThS.T
r
35
r

ần Anh Dũng
CHUỖI KÝ TỰ
CBGD: ThS.T
r
36
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
10
CHUỖI KÝ TỰ
CBGD: ThS.T
r
Khi nhậptrị,hàmnàyđọc các ký tựđếnkhi
nào gặpkýtự quy định hàng mới(tứckýtự
'\n', tức khi ta ấn p hím ENTER) thì kết thúc
việcnhập
37
r
ần Anh Dũng
Hàm này trả về một pointer trỏ
đếnchuỗi, pointer này chính là
tên mảng, là đốisố sau khi gán
chuỗi
CHUỖI KÝ TỰ
CBGD: ThS.T
r
38
r
ần Anh Dũng

Lệnh gets hiểu Dang Thanh Tin là 1 chuỗi (không có dấuxuống hàng)
Lệnh scanf hiểu Dang Thanh Tin là 3 chuỗi(dodấu khoảng trắng)
CHUỖI KÝ TỰ
CBGD: ThS.T
r
Để xuấtchuỗi, hai hàm thường hay được dùng:
¾ puts()
¾
itf()
39
r
ần Anh Dũng
¾
p
r
i
n
tf()
Cả hai hàm có prototype trong file stdio.h.
CHUỖI KÝ TỰ
CBGD: ThS.T
r
40
r
ần Anh Dũng
-
10/26/2009
CBGD: ThS.Trần Anh Dũng
11
CHUỖI KÝ TỰ

CBGD: ThS.T
r
41
r
ần Anh Dũng
CHUỖI KÝ TỰ
CBGD: ThS.T
r
42
r
ần Anh Dũng
CHUỖI KÝ TỰ
CBGD: ThS.T
r
43
r
ần Anh Dũng
Chú ý, nếuchiều dài chuỗi đích không đủ để nhậnhếtdữ liệu
từ chuỗinguồnthìCvẫnthựchiệnviệcgántrị cho chuỗi đích
mà không báo lỗinào,tuynhiênchương trình sẽ chạy sai cho
các lệnh dướihoặc không kết thúc được
CHUỖI KÝ TỰ
CBGD: ThS.T
r
44
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
12

CHUỖI KÝ TỰ
CBGD: ThS.T
r
45
r
ần Anh Dũng
CHUỖI KÝ TỰ
CBGD: ThS.T
r
46
r
ần Anh Dũng
CHUỖI KÝ TỰ
CBGD: ThS.T
r
47
r
ần Anh Dũng
POINTER VÀ VIỆC ĐỊNH VỊ BỘ NHỚ ĐỘNG
CBGD: ThS.T
r
C cho phép khai báo các biến động, các biến này khi cầnthì
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.
Các biến động này đượccấp phát trong vùng nhớ heap, là vùng
đáy bộ nhớ,vàđượcquảnlýbởi các biến pointer
48
r
ần Anh Dũng
Nếuhàmnàyxinđượckhốibộ nhớ cầnthiết thì chúng sẽ trả

về một pointer trỏđến đầukhốinày
Nếu không xin đượckhốibộ nhớ cầnthiết, hàm sẽ về tr ị là
mộtcontrỏ NULL
10/26/2009
CBGD: ThS.Trần Anh Dũng
13
POINTER VÀ VIỆC ĐỊNH VỊ BỘ NHỚ ĐỘNG
CBGD: ThS.T
r
49
r
ần Anh Dũng
POINTER VÀ VIỆC ĐỊNH VỊ BỘ NHỚ ĐỘNG
CBGD: ThS.T
r
50
r
ần Anh Dũng
POINTER VÀ VIỆC ĐỊNH VỊ BỘ NHỚ ĐỘNG
CBGD: ThS.T
r
51
r
ần Anh Dũng
MẢNG CÁC POINTER
CBGD: ThS.T
r
52
r
ần Anh Dũng

10/26/2009
CBGD: ThS.Trần Anh Dũng
14
MẢNG CÁC POINTER
CBGD: ThS.T
r
53
r
ần Anh Dũng
MẢNG CÁC POINTER
CBGD: ThS.T
r
54
r
ần Anh Dũng
MẢNG CÁC POINTER
CBGD: ThS.T
r
55
r
ần Anh Dũng
MẢNG CÁC POINTER
CBGD: ThS.T
r
56
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
15

MẢNG CÁC POINTER
CBGD: ThS.T
r
57
r
ần Anh Dũng
MẢNG CÁC POINTER
CBGD: ThS.T
r
58
r
ần Anh Dũng
POINTER CỦA POINTER
CBGD: ThS.T
r
59
r
ần Anh Dũng
POINTER CỦA POINTER
CBGD: ThS.T
r
60
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
16
POINTER CỦA POINTER
CBGD: ThS.T
r

61
r
ần Anh Dũng
ĐỐI SỐ CỦA HÀM MAIN
CBGD: ThS.T
r
62
r
ần Anh Dũng
CBGD: ThS.T
r
ĐỐI SỐ CỦA HÀM MAIN
63
r
ần Anh Dũng
ĐỐI SỐ CỦA HÀM MAIN
CBGD: ThS.T
r
64
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
17
ĐỐI SỐ CỦA HÀM MAIN
CBGD: ThS.T
r
65
r
ần Anh Dũng

ĐỐI SỐ CỦA HÀM MAIN
CBGD: ThS.T
r
66
r
ần Anh Dũng
POINTER TRỎ ĐẾN HÀM
CBGD: ThS.T
r
67
r
ần Anh Dũng
POINTER TRỎ ĐẾN HÀM
CBGD: ThS.T
r
68
r
ần Anh Dũng
10/26/2009
CBGD: ThS.Trần Anh Dũng
18
ỨNG DỤNG
CBGD: ThS.T
r
• Danh sách liên kết là stack
 Đưamộtphầntử vào stack – thao tác push
 Lấymộtphầntử từ stack – thao tác pop
 Xem stack
 Khởi động stack
• Danh sách liên kế

t

q
ueue
69
r
ần Anh Dũng
q
 Thêm một thông tin vào queue – thao tác add
 Lấymột thông tin khỏi queue – thao tác delete
 Xem trị hiệnhànhcủaphầntửđầucủa queue
 Khởi động queue
BÀI TẬP
CBGD: ThS.T
r
70
r
ần Anh Dũng

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×