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ụ:
// 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ụ:
// 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ụ:
// 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ụ:
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ụ:
// 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ụ:
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:
#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:
#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:
#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:
#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;
}