Professional Documents
Culture Documents
TIN HỌC CƠ SỞ 2
Đặng Bình Phương
dbphuong@fit.hcmuns.edu.vn
1
&
VC
BB
Nội dung
… 34 12 00 00 …
Khái niệm
Địa chỉ của biến là một con số.
Ta có thể tạo biến khác để lưu địa chỉ
của biến này Con trỏ.
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… 34 12 00 00 0B 00 00 00 …
Khai báo
Giống như mọi biến khác, biến con trỏ muốn sử
dụng cũng cần phải được khai báo
char
ch1*ch1, *ch2;
và ch2 là biến con trỏ, trỏ tới vùng nhớ kiểu
int *p1, p2;
char (1 byte).
p1 là biến con trỏ, trỏ tới vùng nhớ kiểu int (4
bytes) còn p2 là biến kiểu int bình thường.
Khái niệm
Con trỏ NULL là con trỏ không trỏ và đâu
cả.
Khác
int n; với con trỏ chưa được khởi tạo.
int *p1 = &n;
int *p2; // unreferenced local varialbe
int *p3 = NULL;
NULL
Khởi tạo
Khi mới khai báo, biến con trỏ được đặt ở
địa chỉ nào đó (không biết trước).
chứa giá trị không xác định
trỏ đến vùng nhớ không biết
trước.
Đặt
<tên địacon
biến chỉtrỏ>
của= biến
&<tênvào con trỏ (toán tử
biến>;
&)
int a, b;
Ví
intdụ
*pa = &a, *pb;
pb = &b;
Tin học cơ sở 2 - Đặng Bình Phương 9
&
VC
BB
Sử dụng con trỏ
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… 05 00 00 00 0B 00 00 00 …
10
a pa Tin học cơ sở 2 - Đặng Bình Phương
&
VC
BB
Kích thước của con trỏ
void main()
{
int a = 5; b = 6;
hoanvi(a, b);
printf(“a = %d, b = %d”, a, b);
}
void hoanvi(int x, int y)
{
int t = x; x = y; y = t;
}
Tin học cơ sở 2 - Đặng Bình Phương 12
&
VC
BB
Truyền giá trị (tham trị)
int x int y
18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25
… 05 00 00 00 06 00 00 00 …
int t = x;
hoanvi int x int y x = y;
y = t;
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… 05 00 00 00 06 00 00 00 …
void main()
{
int a = 2912; b = 1706;
hoanvi(&a, &b);
printf(“a = %d, b = %d”, a, b);
}
void hoanvi(int *x, int *y)
{
int t = *x; *x = *y; *y = t;
}
Tin học cơ sở 2 - Đặng Bình Phương 14
&
VC
BB
Truyền địa chỉ (con trỏ)
int *x int *y
18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25
… 0B 00 00 00 0F 00 00 00 …
int t = *x;
hoanvi int *x int *y *x = *y;
*y = *t;
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… 05 00 00 00 06 00 00 00 …
void main()
{
int a = 2912; b = 1706;
hoanvi(a, b);
printf(“a = %d, b = %d”, a, b);
}
void hoanvi(int &x, int &y)
{
int t = x; x = y; y = t;
}
Tin học cơ sở 2 - Đặng Bình Phương 16
&
VC
BB
Truyền tham chiếu (C++)
int t = x;
hoanvi int &x int &y x = y;
y = t;
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… 05 00 00 00 06 00 00 00 …
Một số lưu ý
Con trỏ là khái niệm quan trọng và khó
nhất trong C. Mức độ thành thạo C được
đánh giá qua mức độ sử dụng con trỏ.
Nắm rõ quy tắc sau, ví dụ int a, *pa = &a;
• *pa và a đều chỉ nội dung của biến a.
• pa và &a đều chỉ địa chỉ của biến a.
Không nên sử dụng con trỏ khi chưa được
khởi tạo. Kết quả sẽ không lường trước
được.
int *pa; *pa = 1904;
… …
… 0B 00 00 00 …
parray
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… …
+1
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… …
–1
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… …
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… …
* ( p + 2 )
0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17
… …
Ví dụ nhập mảng
void main()
{
int a[10], n = 10, *pa;
pa = a; // hoặc pa = &a[0];
Ví dụ xuất mảng
void main()
{
int a[10], n = 10, *pa;
pa = a; // hoặc pa = &a[0];
…
for (int i = 0; i<n; i++)
printf(“%d”, a[i]);
printf(“%d”, p[i]);
printf(“%d”, *(a + i));
printf(“%d”, *(p + i));
printf(“%d”, *(a++));
printf(“%d”, *(p++));
}
a[i] *(a + i) *(p + i) p[i]
Tin học cơ sở 2 - Đặng Bình Phương 27
&
VC
BB
Truyền mảng 1 chiều cho hàm
Chú ý!
Mảng một chiều truyền cho hàm là địa
chỉ của phần tử đầu tiên chứ không phải
toàn mảng.
xuất int a[3] int n
10 11 13 14 15 16 17 18 19 20 21 22 23 24
… …
Ví dụ
void xuat(int a[10], int n)
{
for (int i = 0; i<n; i++)
printf(“%d”, *(a++)); // OK
}
void main()
{
int a[10], n = 10;
Lưu ý
Không thực hiện các phép toán nhân, chia, lấy
phần dư.
Tăng/giảm con trỏ n đơn vị có nghĩa là tăng/giảm
giá trị của nó n*sizeof(<kiểu dữ liệu mà nó trỏ
đến>)
Không thể tăng/giảm biến mảng. Hãy gán một
con trỏ đến địa chỉ đầu của mảng và tăng/giảm
nó.
Đối số mảng một chiều truyền cho hàm là địa chỉ
phần tử đầu tiên của mảng.
Ví dụ
struct PHANSO
{
int tu, mau;
};
PHANSO ps1, *ps2 = &p1; // ps2 là con trỏ
ps1.tu = 1; ps1.mau = 2;
ps2->tu = 1; ps2->mau = 2;
(*ps2).tu = 1; (*ps2).mau = 2;
Tin học cơ sở 2 - Đặng Bình Phương 31
&
VC
BB
Con trỏ cấu trúc
ps2 = &ps1;
ps2->tu = 3; ps2->mau = 4; // ps1 = 3/4