Con trỏ là một trong những phần trọng tâm nhất của C++ .Nếu học C++ mà không hiểu được con trỏ là một điều cực kì đáng tiếc .Nhưng một khi đã hiểu được nó rồi thì lại thấy nó rất dễ ,dễ tới mức học rồi mà không hiểu gì
1.Nói về ứng dụng của con trỏ thì rất ít đối với những bài toán bình thương đơn giản như:
- Hoán đổi giá trị của hai biến chẳng hạn .(ví dụ :điển hình có trong sách :teach your self c++ 21 days trong phần con trỏ)
- Thay đổi giá trị xong không muốn đụng đến biến .
- Tiết kiệm bộ nhớ và công sức để khai báo nhiều biến trong một chương trình dễ gây nhầm lẫn và làm chương trình nặng ,phức tạp.
2.Nói về cao cấp thì có thể thấy rõ nhất trong cơ sở dữ liệu và danh sách liên kết.
- Đối với mảng hay mảng động ta chỉ có thể khai báo được một số phần tử mặc định nhưng đối với danh sách liên kết ta có thể làm mọi thứ thêm bớt phần tử ,xóa ,chèn ....Giúp ta quản lí được nhiều yếu tố hơn .
Ví dụ:điển hình là một chương trình quản lí và sắp xếp sinh viên theo số báo danh.
"Nếu thích hãy tự mình gõ lại code bài này:"
#include <iostream.h>
#include <conio.h>
#include <string.h>
class SV
{
private:
char ten[20];
int sbd;
float toan;
float tin;
float anh;
public:
SV()
{
ten[0]='\0';
sbd=0;
toan=0;
tin=0;
anh=0;
}
SV (char a[],int,float,float,float);
char * get_ten()
{
return ten;
}
int get_sbd()
{
return sbd;
}
float get_toan()
{
return toan;
}
float get_tin()
{
return tin;
}
float get_anh()
{
return anh;
}
void hienthi()
{
cout<<"ten cua sinh vien la:"<<ten<<endl;
cout<<"so bao danh la:"<<sbd<<endl;
cout<<"diem:"<<toan<<";"<<tin<<";"<<anh<<endl;
}
bool operator < (const SV &a)
{
return (sbd < a.sbd);
}
};
SV::SV (char a[],int x,float b,float c,float d)
{
strcpy(ten,a);
sbd=x;
toan=b;
tin=c;
anh=d;
}
class Node
{
private:
SV *sinhvien;
Node *next;
public:
Node ():sinhvien(0),next(0){}
Node (SV *svmoi)
{
sinhvien=svmoi;
next=NULL;
}
void set_next(Node *newnode)
{
next=newnode;
}
Node * get_next()
{
return next;
}
SV * get_sinhvien()
{
return sinhvien;
}
};
class List
{
private:
Node *head;
public:
List ():head(0){}
void chen(SV *newsv);
void hienthi();
};
void List::chen(SV *newsv)
{
Node *p,*q;
p=new Node(newsv);
q=head;
if (head==0)
head=p;
else
{
if (p->get_sinhvien() < head->get_sinhvien() )
{
p->set_next(head);
head=p;
}
else
{
while (q!=0)
{
if (q->get_sinhvien()->get_sbd() < p->get_sinhvien()->get_sbd() && q->get_next()->get_sinhvien()->get_sbd() > p->get_sinhvien()->get_sbd())
{
p->set_next(q->get_next());
q->set_next(p);
}
q=q->get_next();
}
q->set_next(p);
}
}
}
void List::hienthi()
{
Node *temp=head;
while (temp!=0)
{
temp->get_sinhvien()->hienthi();
temp=temp->get_next();
}
}
#include "hamlienket.h"
void main()
{
int n;
int sbd;
float toan,tin,anh;
List dautien;
SV *sinhvien;
cout<<"moi ban nhap vao so luong sinh vien:";
cin>>n;
for (int i=1;i<=n;i++)
{
char ten[20];
cout<<"moi nhap sinh vien thu "<<i<<":"<<endl;
cout<<"moi nhap ten :";
cin.ignore();
cin.getline(ten,20);
cout<<"nhap so bao danh:";
cin>>sbd;
cout<<"moi nhap diem :"<<endl;
cout<<"toan:";
cin>>toan;
cout<<"tin:";
cin>>tin;
cout<<"anh:";
cin>>anh;
sinhvien= new SV(ten,sbd,toan,tin,anh);
dautien.chen(sinhvien);
}
cout<<"\n\n\n danh sach sinh vien"<<endl;
dautien.hienthi();
getch();
}
chương trình dùng để quản lí một loạt sinh viên và tạo thành một danh sách liên kết giúp người dùng dễ quản lí và xem xét.
3.Qua vài ví dụ ở trên ta có thể thấy rất nhiều công dụng của nó và sự linh hoạt của con trỏ.
A.Vậy con trỏ là gì ?
- Con trỏ là một biến (kiểu địa chỉ ) chứa địa chỉ của biến khác .
- Ta sử dụng toán tủ * để lấy giá trị của địa chỉ mà con trỏ đang trỏ tới .
- Ta sủ dụng toán tử & để lấy địa chỉ của địa chỉ mà con trỏ đang trỏ tới .
B.Câu lệnh:
kiểu trả về *tên con trỏ; //cách khai báo một con trỏ
tên con trỏ = & tên biến;//cách khai báo sử dụng con trỏ cho một biến
C.Toán tử "new" và "delete"
- Ta dùng toán tử "new" để cấp phát một vùng nhớ cho con trỏ sử dụng để chứa địa chỉ của biến khác.
Câu lệnh: têncontrỏ=new kiểutrảvề;
- Sau câu lệnh này sẽ trả về địa chỉ của ô nhớ đầu tiên của vùng nhớ mà nó được cấp phát.
- Ta dùng toán tử "delete" để xóa con trỏ trả lại bộ nhớ cho máy tính .Nếu không thực hiện bước này mặc định sau khi chạy chương trình xong thì toàn bộ vùng nhớ đã được cấp phát sẽ được giải phóng .
D.Những chú ý:
- Con trỏ có một số điều giống với tham chiếu .Khi thao tác trên con trỏ thì dữ liệu của biến mà con trỏ đang trỏ tới cũng bị thay đổi theo giống như sử dụng tham chiếu .
- Sau khi con trỏ đã trỏ tới một biến này nay lại trỏ tới biến khác thì biến ban đầu mà con trỏ trỏ tới không bị mất mà nó vẫn nằm trong bộ nhớ .Sau khi ra khỏi chương trình thì các đối tượng này mới bị xóa.
E.Danh sách liên kết (Cực hay )
- Như đã nói ở trên khi sử dụng con trỏ trỏ tới một biến thì những gì ta làm trên con trỏ cũng như tác động đến biến .Hãy nhớ rõ điều này vì danh sách liên kết dựa chủ yếu trên điều này của con trỏ .
- Khi bạn học đến phần này đảm bảo rằng thầy cô sẽ nói là danh sách liên kết như một cái dây thừng có nhiều nút mà một nút có hai phần đó là data và một con trỏ có tác dụng trỏ đến nút tiếp theo.
Xét ví dụ lớp sinh viên ở trên
Các bạn thấy rõ tôi viết riêng cả 3 phần tách biệt nhau cho thật tường minh và cho các bạn dễ hiểu .
a.Data là lớp sinh viên gồm có tên điểm và số báo danh.
b.Nút gồm Data và một con trỏ trỏ tới nút tiếp theo.
c.Một lớp danh sách .
Ở đây quan trọng nhất là hàm chèn.
Hãy nắm chắc trong đầu rằng khi con trỏ trỏ tới một biến thì những gì tác động lên con trỏ sẽ ảnh hưởng đến biến.Nếu chỗ nào không hiểu đơn giản chỉ việc vẽ hình .
Bạn hãy coi con trỏ trong danh sách liên kết là một con "MA" có thể nhập vào hết đối tượng này đến đối tượng khác .
Hãy nghiền ngẫm đọc từng đoạn code . Hãy chú ý đến các phương thức get,set và cách hoạt động của nó . Nếu không hiểu thì post bài hỏi tiếp đừng cố hiểu để rồi tẩu hỏa nhập ma.