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 pint *p;// con trỏ thựcfloat *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 ap=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 mainint main() {// khai bao 2 con tro intint a,b,*p1,*p2;// Nhap 2 socout<<"\n So 1= "; cin>>a;cout<<"\n So 2= "; cin>>b;p1=&a; p2=&b;// tinh tongint 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 mainint 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 mangint a[100],*p,n;// Nhap mangvoid 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 mangvoid InMang(){ p=a; cout<<"\n In day: "; for(int i=0; i<n;i++) cout<<*(p+i)<<" ; ";}// Tim maxint Max(){ p=a; int max=*p; for(int i=0; i<n;i++) if( *(p+i)>max) max=*(p+i); return max;}//Ham mainint 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 nodestruct Node{ int info; Node *next;};typedef Node *DS;void khoiTao(DS &p){ p=NULL;}// Tao danh sachDS taoNode(int a){ DS p=new Node; p->next = NULL; p->info = a; return p;}// them phan tu vao dau danh sachDS 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 sachDS 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 sachvoid InDs(DS p){ while (p->next!=NULL){ p=p->next; cout<<p->info<<" -> "; }cout<<"NULL\n\n";}//Xoa 1 node o dau danh sachDS XoaDau(DS p){ DS p1; p1=p; p=p->next; delete p1; return p;}// ham mainint 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;} |
