Con trỏ là một biến chứa một địa chỉ bộ nhớ.
 Thông thường địa chỉ này là vị trí của một 
biến khác.
 Nếu X chứa địa chỉ của Y thì ta nói X trđến 
Y
 Biến con trỏ phải được khai báo nhưsau:
kiểu *tên biến
Ví dụ: để khai báo một biến p là con trỏ trỏ đến 
số nguyên
                
              
                                            
                                
            
                       
            
                 17 trang
17 trang | 
Chia sẻ: lylyngoc | Lượt xem: 2070 | Lượt tải: 1 
              
            Bạn đang xem nội dung tài liệu Bài 8 Con trỏ (pointer), để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Bài 8
CON TRỎ
(POINTER)
Nội Dung
1. Khái niệm con trỏ
2.Các toán tử con trỏ
3. Phép tính số học trên con trỏ
4.Con trỏ và mảng
5.Con trỏ và chuỗi
6.Mảng con trỏ
7.Null pointer
8.Trỏ gián tiếp
1. Khái niệm con trỏ
 Con trỏ là một biến chứa một địa chỉ bộ nhớ.
 Thông thường địa chỉ này là vị trí của một 
biến khác.
 Nếu X chứa địa chỉ của Y thì ta nói X tr đến 
Y
 Biến con trỏ phải được khai báo như sau:
kiểu *tên biến
Ví dụ: để khai báo một biến p là con trỏ trỏ đến 
số nguyên 
int *p
2.Các toán tử con trỏ
 Có hai toán tử đặc biệt được dùng với con 
trỏ: * và &. 
 Toán tử & trả về địa chỉ bộ nhớ của toán 
hạng. Ví dụ:
ptr = &x ;// &x có đọc là địa chỉ của x
 Toán tử * trả về giá trị của biến được đặt tại 
địa chỉ được chỉ ra trong toán hạng. Ví dụ :
giatri = *ptr ;//*ptr có thể đọc là nội dung tại 
địa chỉ ptr
#include 
using namespace std;
int main()
{
int x;
int *ptr;
int giatri;
x = 3200;
ptr = &x;
giatri = *ptr;
cout << "Gia tri x la: " << giatri<< '\n';
return 0;
}
ptr
100
x
3200
giatri
0 1 2 100 101
ptr
100
x
3200
giatri
3200
0 1 2 100 101
ptr = &x ;
Địa chỉ bộ nhớ
Bộ nhớ
giatri = *ptr
 Có thể gán giá trị vào vị trí được chỉ định bởi 
một con trỏ
ví dụ : *p = 121 ;// tại vị trí được chỉ bởi p, 
gán giá trị 121.
 Có thể tăng giảm giá trị nội dung tại vị trí 
được chỉ định bởi p bằng toán tử ++, hay --
ví dụ: (*p)++ 
(*p)--
3. Phép tính số học trên con trỏ
 Có bốn phép toán số học được thực hiện đối 
với con trỏ là ++, --, +, -
 Ví dụ con trỏ số nguyên pi có giá trị 2000 (nó
chứa địa chỉ 2000). Giả sử số nguyên 32 bit 
thì sau ki thực hiện câu lệnh 
pi++;
nội dung của pi là 2004
 pi = pi + 8; //làm cho pi trỏ đến phần tử thứ 8
Viết chương trình tạo một mảng a gồm 10 phần tử và 
in ra địa chỉ của các phần tử này
#include 
using namespace std;
int main()
{ 
int *p, i, a[10];
p = a;
for (i = 0; i<10; i++)
cout<< "Dia chi cua a["<<i<<"] la:"<< p+i<< '\n';
return 0;
}
4.Con trỏ và mảng
 Trong C++, mảng và con trỏ có quan hệ gần
ví dụ:
char str[80];
char *p;
p = str;
 Con trỏ được gán địa chỉ của phần tử mảng
 Viết tên mảng không có index tương đương với con 
trỏ chỉ đến phần tử thứ 1 (str[0])
 Muốn truy xuất đến phần tử thứ 4 có thể dùng 
*(p+3)
Viết chương trình nhập vào một câu rồi in mỗi 
từ trên một hàng, dùng con trỏ
#include 
#include 
using namespace std;
int main()
{
char str[80], token[80], *p, *q;
cout<< "Nhap mot cau: ";
gets(str);
p=str;
while (*p) {
q = token;
while (*p !=' ' && *p) {
*q = *p;
q++; p++;
}
if (*p) p++;
*q = '\0'; \\chèn null
cout<< token << '\n';
}
return 0;
}
 Với con trỏ có thể được truy xuất theo chỉ số 
như mảng, ví dụ:
char *p;
char str[20];
p = str;
p[4] = 'h';
 Tuy nhiên, mảng và con trỏ không thể dùng 
thay thế cho nhau.
5.Con trỏ và chuỗi
 Khi bắt gặp một chuỗi ký tự, trình biên dịch 
sẽ lưu trong một bảng chuỗi và phát sinh ra 
một con trỏ để chỉ đến chuỗi này. ví dụ
#include 
using namespace std;
int main()
{
char *s;
s = "Dùng con trỏ là hiệu quả.\n";
cout << s;
return 0;
}
6.Mảng con trỏ
 Các con trỏ cũng có thể hình thành mảng. Ví dụ
int *pa[10];
khai báo pa như là một mảng chứa 10 con trỏ kiểu 
integer. Mỗi phần tử giữ một con trỏ chỉ đến một giá
trị integer.
 Để gán một địa chỉ vào phần tử mảng có thể dùng 
toán tử &, ví dụ pa[2] = &var;
 Dùng mảng pa để gán giá trị của var cho biến x
pa[2] = &var
x = *pa[2]
7.Null pointer
 Nếu con trỏ chứa giá trị 0 (null), được xem 
như không chỉ đến bất kỳ đâu. 
 Tất cả các con trỏ không được dùng được 
gán giá trị null và tránh dùng con trỏ null thì
tránh được các sự cố trong chương trình
 Bất cứ kiểu con trỏ nào đều có thể khởi động 
bằng giá trị null
ví dụ: float *p = 0; 
8.Trỏ gián tiếp
 Một con trỏ chỉ đến một con trỏ khác là hình 
thức trỏ gián tiếp.
Địa chỉ Giá trị
pointer Biến
Trỏ trực tiếp
Địa chỉ Giá trị
pointer Biến
Trỏ gián tiếp
Địa chỉ
pointer
 Khai báo trỏ gián tiếp, ví dụ
int **balance;
balance không phải là con trỏ chỉ đến số integer mà là chỉ đến một con 
trỏ kiểu integer.
#include 
using namespace std;
int main()
{
int x, *p, **q;
x = 10;
p = &x;
q = &p;
cout << **q; // in giá trị x
return 0;
}