CHƯƠNG 5CHƯƠNG 5
CON TRỎCON TRỎ
(Pointers)(Pointers)
(Pointers)(Pointers)
1. Giớithiệu1. Giớithiệu
1.
Giới
thiệu1.
Giới
thiệu
y Mộtcontrỏ là 1biếnchứamột địachỉ bộ
nhớ. Địachỉ này là vị trí củamột đốitượn
g
khác trong bộ nhớ.
y Nếumộtbiếnchứa địachỉ củamộtbiếnkhác,
biếnthứ nhất đượcgọilàtrỏđếnbiếnthứ hai.
1. Giớithiệu1. Giớithiệu
1.
Giới
thiệu1.
Giới
thiệu
Đ
ị
ach
ỉ
Biếntrong
ị
bộ nhớ
bộ nhớ
Mộtbiến đượccấp phát ô
nhớ tại địachỉ 1000 có
giá
trị
là
địa
chỉ
(
1003
)
giá
trị
là
địa
chỉ
(
1003
)
của1biến khác. Biếnthứ
nhất đượcgọilàcontrỏ.
Bộ nhớ
2. Khai báo bi2. Khai báo bi
ếế
n con trn con tr
ỏỏ
2. Khai báo bi2. Khai báo bi
ếế
n con trn con tr
ỏỏ
y Cú pháp:
type *pointerVariable;
type
:xácđịnh kiểudữ liệucủabiếnmà
type
:
xác
định
kiểu
dữ
liệu
của
biến
mà
con trỏ trỏ đến.
Ví dụ:
Ví
dụ:
int *a;
a
3. Toán
t
3. Toán
t
ửử
con t
r
con t
r
ỏỏ
((
p
ointer o
p
erator
sp
ointer o
p
erator
s
))
((
pppp
))
y
Toán tử &
là toán tử 1 ngôi, trả về địa chỉ bộ
nhớ của toán hạn
g
của nó.
◦ Toán tử & dùng để gán địa chỉ của biến cho
biến con trỏ
Cú
p
há
p
:
pp
<Tên biến con trỏ>=&<Tên biến>
3. Toán t3. Toán t
ửử
con trcon tr
ỏỏ
((
pointer operatorspointer operators
))
3. Toán t3. Toán t
ửử
con trcon tr
ỏỏ
((
pointer operatorspointer operators
))
y
Ví dụ:
a
25
x
25
a
25
x
y
25
int a=25, x;
int *y;
y
x=a;
y=&a;
y
3. Toán t3. Toán t
ửử
con trcon tr
ỏỏ
((
pointer operatorspointer operators
))
3. Toán t3. Toán t
ửử
con trcon tr
ỏỏ
((
pointer operatorspointer operators
))
y
Toán tử *
: là toán tử một ngôi trả về giá trị
tại địa chỉ con trỏ trỏ đến.
Cú pháp
:
*<Tên biến con trỏ>
V
í d
ụ
:
a=*
p
;
ụ
p;
4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ
4.
Các
thao
tác
trên
con
trỏ4.
Các
thao
tác
trên
con
trỏ
y
Lệnh gán con trỏ
Có thể dùng phép gán để gán giá trị củamột
con trỏ cho mộtcontrỏ khác có cùng kiểu
V
í
d
ụ
:
int x;
int *p1, *p2;
p1 = &x;
p2 = p1;
Sau khi đ
ọ
an l
ệ
nh trên đư
ợ
c th
ự
c hi
ệ
n
,
cả
ọ ệ ợ ự ệ ,
hai p1 và p2 cùng trỏ đến biến x.
4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ
4.
Các
thao
tác
trên
con
trỏ4.
Các
thao
tác
trên
con
trỏ
y
Phép toán số học trên con trỏ
◦ Chỉ có 2 phép toán sử dụng trên con trỏ là
phép cộng và trừ
◦ Khi cộng (+) hoặctrừ (-) 1 con trỏ với1số
n
g
u
y
ên N
;
kết
q
uả trả về là 1 con trỏ.Con
gy
;
q
trỏ này chỉđến vùng nhớ cách vùng nhớ của
con trỏ hiệntạimộtsố nguyên lầnkích
thướ
ủ
kiể
dữ
liệ
ủ
ó
thướ
cc
ủ
a
kiể
u
dữ
liệ
uc
ủ
an
ó
.
4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ
4.
Các
thao
tác
trên
con
trỏ4.
Các
thao
tác
trên
con
trỏ
Ví dụ :
char *a;
short *b;
lon
g
*c;
Các con trỏ a, b, c lần lượt trỏ tới ô nhớ
1000
2000
à
3000
1000
,
2000
v
à
3000
.
Cộng các con trỏ với một số nguyên:
1// ỏ dời đi1b
a = a +
1
;
//
con tr
ỏ
a
dời
đi
1
b
yte
b = b + 1;//con trỏ b dời đi 2 byte
c = c + 1; //con trỏ cdời đi4byte
c
=
c
+
1;
//con
trỏ
c
dời
đi
4
byte
4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ
4.
Các
thao
tác
trên
con
trỏ4.
Các
thao
tác
trên
con
trỏ
4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ
4.
Các
thao
tác
trên
con
trỏ4.
Các
thao
tác
trên
con
trỏ
y
Lưuý:
cả hai toán tử tăng (++) và giảm ( )
đềucóquyền ưutiênlớnhơntoánt
ử
*
Ví dụ: *p++;
Lệnh *p++ tương đương với *(p++) : thực
hiện
là
tăng
p
(địa
chỉ
ô
nhớ
mà
nó
trỏ
tới
hiện
là
tăng
p
(địa
chỉ
ô
nhớ
mà
nó
trỏ
tới
chứ không phảilàgiátrị trỏ tới).
4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ
4.
Các
thao
tác
trên
con
trỏ4.
Các
thao
tác
trên
con
trỏ
Ví dụ:
*p++ = *q++;
y Cả hai toán tử tăng (++) đều được thực hiện
sau khi
g
iá trị của *q được
g
án cho *p và sau
đó cả q và p đều tăng lên 1. Lệnh này tương
đươ ới
đươ
n
g
v
ới
:
*p = *q;
p++;
q++;
4. Các thao tác trên con trỏ4. Các thao tác trên con trỏ
4.
Các
thao
tác
trên
con
trỏ4.
Các
thao
tác
trên
con
trỏ
#include <iostream.h>
#include<conio h>
#include<conio
.
h>
void main ()
{
int a = 20, b = 15, *pa, *pb, temp;
pa = &a; // con trỏ pa chứa địa chỉ của a
pb
=
&b; // con trỏ pb chứa địachỉ củab
pb
&b;
//
con
trỏ
pb
chứa
địa
chỉ
của
b
temp = *pa;
*pa = *pb;
*pb temp;
// kết quả xuất ra
àhìh
*pb
=
temp;
cout << "a = " << a << endl;
cout << “b = ” << b;
m
à
n
hì
n
h
a = 15
b
=
20
}
b
20
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Con trỏ cung cấpsự hổ trợ cho cấpphátbộ
nhớđộn
g
tron
g
C/C++.
y Cấpphátđộng là phương tiệnnhờđómột
h
ìh
ó
hể
dà h
đ
hê
bộ
hớ
c
h
ươn
g
tr
ì
n
h
c
ó
t
hể
dà
n
h
đ
ượct
hê
m
bộ
n
hớ
trong khi đang thựcthi,giảiphóngbộ nhớ khi
không
cần
thiết
không
cần
thiết
y C/C++ hổ trợ hai hệ thống cấpphátđộng:
một
hệ
thống
được
định
nghĩa
bởi
C
và
một
một
hệ
thống
được
định
nghĩa
bởi
C
và
một
được định nghĩabởi C++.
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Cấpphátđộng được định nghĩabởiC
−
Vùng nhớ Heap
đượcsử dụng cho việccấp
phát động các khốibộ nhớ trong thờigian
thựcthichươn
g
trình. Gọilàbộ nhớđộn
g
.
−
Hà
m
malloc
()
và
free
()
dùn
g
đ
ể
cấ
p
p
hát
()
()
g
p
p
và thu hồibộ nhớ,trongthư viện stdlib.h
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Hàm malloc(): cấp phát bộ nhớ động.
ủ hà ó d
−Prototype c
ủ
a
hà
m c
ó
d
ạn
g
void *malloc(length)
length
:
là
số
byte
muốn
cấp
phát
−
length
:
là
số
byte
muốn
cấp
phát
.
− Hàm malloc() trả về mộtcontrỏ có kiểu
void
,
do đócóth
ể
g
án nó cho con trỏ có
,
g
kiểubấtkỳ.
−Sau khi cấp phát thành công, hàm malloc()
trả
về
địa
chỉ
của
byte
đầu
tiên
của
vùng
trả
về
địa
chỉ
của
byte
đầu
tiên
của
vùng
nhớđượccấppháttừ heap. Nếu không
thành côn
g
(
khôn
g
có đủ vùn
g
nhớ rỗi
y
êu
g
(g
g
y
cầu), hàm malloc() trả về null.
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Ví dụ:
char *p;
p = (char *) malloc(1000); //cấp phát 1000
bytes
Vì hàm malloc
()
trả về con trỏ kiểu
v
oid
,
nên
()
,
phảiépkiểu (casting) nó thành con trỏ char
cho phù hợpvớibiếncontrỏ p.
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Ví dụ:
int *p;
p
=
(
int *
)
malloc
(
50*sizeof
(
int
))
;
p
(
)
(
())
Toán tử sizeof để xác định kích thướckiểu
d
ữ
li
ệ
uint.
ệ
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Kích thướccủaheapkhôngxácđịnh nên khi
ể
cấpphátbộ nhớ phảiki
ể
mtra
g
iá trị trả về
củahàmmalloc()để biếtlàbộ nhớ có được
cấp
phát
thành
công
hay
không
cấp
phát
thành
công
hay
không
.
Ví dụ:
p = (int *)malloc(100);
p
=
(int
*)malloc(100);
if(p == NULL)
{
{
cout << "Khong du bo nho";
exit(1);
exit(1);
}
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Hàm free(): Trả về vùng nhớ được cấp phát
bởi hàm malloc().
y Cú pháp:
v
oid free(void *p);
p là con trỏ đến vùng nhớ đã được cấp phát
trước đó bởi hàm malloc().
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Cấp phát động được định nghĩa bởi C++
C++ cung cấphaitoántử cấpphátbộ nhớ
động: new và delete.
−Toán tử new cấpphátbộ nhớ và trả về
m
ộ
tcontrỏđếnb
y
te đầutiêncủavùn
g
nhớ
ộ
y
g
đượccấpphát.
−Toán t
ử
delete thu hồivùn
g
nhớđư
ợ
ccấ
p
g
ợ
p
phát trước đóbởitoántử new.
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Cú pháp:
p = new type;
delete
p
;
p
y plàmộtbiếncontrỏ nhận địachỉ của vùng
nhớđư
ợ
ccấ
p
p
hát đủ lớn đ
ể
chứa1đối
ợ
p
p
tượng có kiểulàtype
5. Cấpphátbộ nhớ động5. Cấpphátbộ nhớ động
5.
Cấp
phát
bộ
nhớ
động5.
Cấp
phát
bộ
nhớ
động
y Ví dụ:
#incl de <iost eam h>
#incl
u
de
<iost
r
eam
.
h>
#include <new>
int main
()
()
{
int *p;
it// ll t f it
p = new
i
n
t
;
//
a
ll
oca
t
e space
f
or an
i
n
t
*p = 100;
cout <<
"
At
"
<< p <<
""
;
cout
<<
At
<<
p
<<
;
cout << "is the value " << *p << "\n";
delete p;
t0
re
t
urn
0
;
}
6. Con trỏ6. Con trỏ
voidvoid
((
void pointersvoid pointers
))
6.
Con
trỏ
6.
Con
trỏ
voidvoid
((
void
pointersvoid
pointers
))
y Con trỏ void là mộtlọai con trỏđặcbiệtmà
ể
ể
có th
ể
trỏđếnbấtkỳ ki
ể
ud
ữ
liệunào.
y Cú pháp:
v
oid *pointerVariable;
y Ví dụ:
void *p;
p = &a; // p trỏ đến biến nguyên a
p = &f; //p trỏ đến biến thực f