Nền tảng Kiến thức - Hành trang tới Tương lai
Card image

Chương 2-Bài 12. Con trỏ trong C++ (POINTER)

Tác giả: Dương Nguyễn Phú Cường
Ngày đăng: Hồi xưa đó

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;
}