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

PHƯƠNG PHÁP LẬP TRÌNH_5 pdf

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 (646.49 KB, 37 trang )

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
Đ



ach

Biếntrong

bộ nhớ
bộ nhớ
Mộtbiến đượccấp phát ô
nhớ tại địachỉ 1000 có
giá
trị

địa
chỉ
(
1003
)
giá
trị

đị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



con trỏ trỏ đến.

Ví dụ:


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ỏ

p

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

tăng
p
(địa
chỉ
ô
nhớ


trỏ
tới
hiện

tăng
p
(địa

chỉ
ô
nhớ


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

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
đ

bộ
hớ
c
h
ươn
g
tr
ì

n
h
c
ó
t
hể

n
h
đ
ượct

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

một
một
hệ
thống
được
định
nghĩa
bởi
C

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
.


m
malloc
()

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

m c
ó

d
ạn
g
void *malloc(length)
length
:

số
byte
muốn
cấp
phát

length
:

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

×