Lê Thúy Ngọc
1
Con trỏ
Lê Thúy Ngọc
Lê Thúy Ngọc
2
Biến
int a;
a = 5;
Tên biến: a
KDL: int
Giá trị: giá trị rác
<14>
0101
000000000000
<18>
Lê Thúy Ngọc
3
Biến
Mang tính định lượng: có thể cân, đong,
đo, đếm, so sánh, …
VD:
int a = 5, b = 30;
if (a == b)
b = 15;
a = b;
Lê Thúy Ngọc
4
Biến con trỏ
1. Định nghĩa: là 1 biến dùng để chứa địa
chỉ của1 biến khác.
2. Có nhiều KDL => có nhiềukiểu con trỏ
3. Không mang tính định lượng
4. Mang tính chỉ mục
5. Kích thướccủabiến con trỏ là 2B (DOS)
và 4B (Win)
Lê Thúy Ngọc
5
Khai báo biến con trỏ
<KDL> *<tên biến>;
VD:
int *p; //p là biến con trỏ, trỏ tớikiểuint
char *q;
- q là 1 biến con trỏ
- q trỏ tới1 biếnkiểu char (q chứa địachỉ của1 biếnkiểu
char)
- q đượccấp phát vùng nhớ là 4B
Lê Thúy Ngọc
6
Địachỉ ô nhớ
Bắt đầutừ 0
Mỗiô nhớ có 1 địachỉ
Các ô nhớ liên tiếp nhau sẽ có địachỉ liên
tiếp nhau.
<14>
<18>
<…> <15>
<0>
<16> <17>
<….>
Lê Thúy Ngọc
7
Toán tử &
&<biếnthường>
Cho địachỉ ô nhớ dành cho biến đikèm
VD:
int m, *p;
&m: //cho địachỉ củabiếnm (địachỉ củabyte đầutiêncủabiến
m)
scanf(“%d”, &m); Å 5 //đặt vào ô nhớ có địachỉ là (&m) giá trị 5
p = &m; //p trỏđếnm (p chứa địachỉ củam)
scanf(“%d”, p); Å 5 //đặt5 vàoô nhớ có địachỉ là p
Lê Thúy Ngọc
8
Minh hoạ
125
<24><12>
p(m)
125
p(m)
Lê Thúy Ngọc
9
Ví dụ
1. int n, m, *p, *q, *s;
2. char c;
3. p = n;
4. p = &n;
5. q = p;
6. p = &m; =>q???
7. q = &p;
8. s = &c;
9. p = 10;
p trỏ tớin
q trỏ tớiô nhớ
mà p đang trỏ tới
Lê Thúy Ngọc
10
Toán tử *
*<biến con trỏ>
cho nội dung ô nhớ mà biến con trỏ trỏ tới
VD:
int x, *px;
px = &x;
=> *px và x là tương đương trong mọingữ cảnh
Lê Thúy Ngọc
11
Ví dụ
x = 5;
int y = x;
if (x == z)
printf(“%d”,x);
scanf(“%d”,&x);
int *q; q = &x
*px = 5;
int y = *px
if (*px == z)
printf(“%d”, *px);
scanf(“%d”,px);
q = &(*px) <=>q =p;
Đặt5 vàoô nhớ mà
px trỏ tới
Đếnô nhớ mà px
trỏ tớilấynội dung
Khi biết địachỉ 1 biến
thì có thể làm thay đổi
giá trị củabiến
Lê Thúy Ngọc
12
Ví dụ
int n = 5, *p;
p = &n; printf(“%d”, *p);
=>output: 5
*p = n + *p; printf(“%d %d”,*p,n);
=>output: 10 10
n = 20; printf(“%d %d”,*p,n);
=>output: 20 20
Lê Thúy Ngọc
13
Ví dụ
m = 2
*p = 2
*q = 2
*q = n = 7
m = 2 + 7 = 9 =>*p = 9
n = 9 + 7 = 16=>*q = 16
*p = 9*16 = 144 =>m=144
int m, n, *p, *q;
m = 2;
p = &m;
q = p;
p = &n;
scanf(“%d”,p);Å7
m = *p + *q;
n = *p + *q;
*p = m*n;
printf(“%d %d %d
%d”,*p,*q,m,n);
Lê Thúy Ngọc
14
Ví dụ
int n, *p, *q;
p = q;
q = &n;
scanf(“%d”,q);
printf(“%d %d %d”, *p ,*q,n);
sử dụng biến con
trỏ không hợplý
không bao giờ
sử dụng biến con trỏ khi nóchưa
trỏđến vùng nhớ hợplệ
Lê Thúy Ngọc
15
phép toán số học trên con trỏ
int *p, m;
p = &m;
p = p + 5;
= <dc> + 5 *sizeof(int)
= 12 + 5*4
= 32
Lê Thúy Ngọc
16
Minh hoạ
125
<24><12>
p(m)
125
<36><32><28>
qp(m)
Lê Thúy Ngọc
17
Ví dụ
int *p, m[10] = {1,2,3,4,5,6,7,8,9,10};
p = &m;
printf("%d ",*p);
p = p + 5;
printf("%d ",*p);
=>Output: 1 6
Lê Thúy Ngọc
18
toán tử -
Giữa 2 biến con trỏ chỉ tồn tại duy nhất
toán tử -
hiệu của 2 biến con trỏ cho ra khoảng
cách giữa 2 ô nhớ mà 2 con trỏ trỏ tới
q – p = (<36>-<24>)/sizeof(int)=3
Lê Thúy Ngọc
19
Ví dụ
int m,n,*p,*q;
p = &m;
q = &n;
printf(“%d”,p-q);
Lê Thúy Ngọc
20
Ví dụ
int a[10],*p,*q;
p = &a[2];
q = &a[5];
printf(“%d”,q-p);
=>Output: 3
Lê Thúy Ngọc
21
Con trỏ cấutrúc
struct PHANSO
{ int tu;
int mau;
};
PHANSO *ps1, *ps2, *ps3, ps4, ps5, ps[100]
con trỏ cấutrúcbiếncấutrúc
mảng cấutrúc
Lê Thúy Ngọc
22
Con trỏ cấutrúc
ps1 = &ps4;
// gán địachỉ của ps4 cho ps1 (ps1 trỏđếnps4)
ps2 = &ps[2];
//ps2 chứa địachỉ của ps[2] (ps2 trỏđếnps[2])
ps3 = ps;
//ps2 chứa địachỉ ps (ps[0]) (ps2 trỏđếnô nhớ
chứa ps[0]/ ps2 trỏđếnps
Lê Thúy Ngọc
23
Truy cập thông qua con trỏ
Có thể truy cập các thành phần thông qua
con trỏ theo 1 trong 2 cách:
Tên_con_trỏ
Æ
tên_thành_phần
(*Tên_con_trỏ) . tên_thành_phần
sau khi thựchiện các phép gán ps1 =
&ps4; các cách viết sau là tương đương:
ps1
Æ
tu và (*ps1).tu và ps4.tu
Lê Thúy Ngọc
24
Phép gán thông qua con trỏ
*ps1
Ù
ps4
*ps2
Ù
ps[2];
*ps3
Ù
ps[0];
ps4 = ps5; ps[2] = ps4;
Ù
*ps1 = ps5; *ps2 = *ps1;
Lê Thúy Ngọc
25
Phép cộng, trừđịachỉ
ps2 = &ps[2] ;
ps2 trỏ tớicácphầntử bấtkỳ khác
ps2 = ps2 – 2 ; //ps2 sẽ trỏ tớips[0]
ps2 = ps2 + 5; //ps2 sẽ trỏ tớips[7]