Khái niệm về con trỏ (pointer)
Biến con trỏ là biến chứa địa chỉ của biến khác có cùng kiểu với nó.
Khai báo con trỏ
<KDL> *<biến con trỏ>;
Ví dụ:
1
2
3
4
5
6
7
8
|
// con trỏ nguyên p int *p; // con trỏ thực float *pt; // con trỏ trỏ vào con trỏ int **ptr; |
Sử dụng con trỏ
– Toán tử “*“: Lấy giá trị tại địa chỉ đã nào đó.
Ví dụ:
1
2
|
// gán a = giá trị tại vị trí mà p trỏ vào. a=*p; |
– Toán tử “&“: Cho địa chỉ của biến nào đó.
Ví dụ:
1
2
3
|
// con trỏ p trỏ vào biến a. p=&a; // a và *p là tương đương. |
Con trỏ mảng
– Tên mảng chính là địa chỉ của phần tử đầu tiên của mảng.
– Để truy cập các phần tử trong mảng ta dùng biến con trỏ mảng công với địa chỉ tương đối của chúng.
Ví dụ:
1
2
3
4
|
int a[10], *p; // p trỏ vào mảng a p=a; // *(p+2) tương đương với a[2]. |
Con trỏ cấu trúc
– Khai báo:
<Tên cấu trúc> *<biến con trỏ>;
Ví dụ:
1
2
|
// khai báo con trỏ cấu trúc SV SV *p; |
– Truy cập các trường trong cấu trúc bằng “->
” thay cho “.
“.
Ví dụ:
1
|
p->diem; // thay cho a.diem. |
Ví dụ 1:
+ Yêu cầu: Viết chương trình nhập vào 2 số nguyên, tính tổng của chúng (sử dụng biến con trỏ).
+ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream> #include <conio.h> using namespace std; //Ham main int main() { // khai bao 2 con tro int int a,b,*p1,*p2; // Nhap 2 so cout<< "\n So 1= " ; cin>>a; cout<< "\n So 2= " ; cin>>b; p1=&a; p2=&b; // tinh tong int s = *p1 +*p2; cout<< "\n Tong = " <<s; return 0; } |
Ví dụ 2
+ Yêu cầu: sử dụng toán tử * và &.
+ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#include <iostream> #include <conio.h> using namespace std; //Ham main int main () { int value1 = 5, value2 = 15; int *p1, *p2; // p1 = dia chi value1 p1 = &value1; // p2 = dia chi value2 p2 = &value2; // gia tri cua p1=10 *p1 = 10; // gia tri cua p1=10 *p2 = *p1; // p1 = p2 (phep gan con tro) p1 = p2; *p1 = 20; cout << "value1==" <<value1<< " / value2==" << value2; return 0; } |
Ví dụ 3:
+ Yêu cầu: Viết chương trình (sử dụng con trỏ mảng)
– Nhập một dãy số nguyên có không quá 100 số.
– In dãy
– Tim giá trị lớn nhất
+ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <iostream> #include <conio.h> using namespace std; // khai bao mang int a[100],*p,n; // Nhap mang void NhapMang(){ // Nhap so phan tu mang do { cout<< "\n n= " ; cin>>n; if (n<1||n>100) cout<< "\n Nhap lai n! " ; } while (n<1||n>100); // p tro vao mang a p=a; for ( int i=0; i<n;i++) { cout<< "\n a[" <<i<< "]= " ; cin>>*(p+i); } } // In mang void InMang(){ p=a; cout<< "\n In day: " ; for ( int i=0; i<n;i++) cout<<*(p+i)<< " ; " ; } // Tim max int Max(){ p=a; int max=*p; for ( int i=0; i<n;i++) if ( *(p+i)>max) max=*(p+i); return max; } //Ham main int main () { NhapMang(); InMang(); cout<< "\n Max: " <<Max(); return 0; } |
Ví dụ 4:
+ Yêu cầu: Viết chương trình (sử dụng con trỏ cấu trúc)
– Khai báo danh sách liên kết đơn
– Nhập danh sách
– In danh sách
+ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
|
#include<conio.h> #include<stdio.h> #include<iostream> using namespace std; //Khai bao 1 node struct Node{ int info; Node *next; }; typedef Node *DS; void khoiTao(DS &p){ p=NULL; } // Tao danh sach DS taoNode( int a){ DS p= new Node; p->next = NULL; p->info = a; return p; } // them phan tu vao dau danh sach DS Add_fisrt(DS &p, int a){ DS p2=taoNode(a); if (p2==NULL){ return NULL; } p2->next=p; p=p2; return p; } // them phan tu vao cuoi danh sach DS Add_last(DS &p, int a){ DS p1=taoNode(a); if (p1==NULL){ return NULL; } if (p==NULL) { p=p1; return p1; } DS pt=p; while (pt->next!=NULL) pt=pt->next; pt->next=p1; return p; } //In danh sach void InDs(DS p){ while (p->next!=NULL){ p=p->next; cout<<p->info<< " -> " ; }cout<< "NULL\n\n" ; } //Xoa 1 node o dau danh sach DS XoaDau(DS p){ DS p1; p1=p; p=p->next; delete p1; return p; } // ham main int main(){ int x,n; DS p,p1,p2; p=taoNode(x); cout<< "\n** TAO DANH SACH LIEN KET \n " ; cout<< "* Nhap so phan tu:" ; cin>>n; for ( int i=1; i<=n;i++) { cout<< "\n + Nhap gia tri cua Node thu " <<i<< ": " ; cin>>x; //Cong them phan tu vao dau p1=Add_last(p,x); } //In danh sach vua tao cout<< "\n\n * Danh sach vua tao: \n" ; InDs(p1); //Cong vao dau danh sach vua tao mot node co gia tri x p2=p1; cout<< "* Cong vao cuoi danh sach phan tu co gia tri la x \n" ; x=1; p1=Add_last(p2,x); InDs(p1); //Xoa 1 node dau danh sach p1=XoaDau(p1); cout<< "\n\n * In danh sach vua xoa mot phan tu dau:\n" ; InDs(p1); return 0; } |