[Tự học lập trình C/C++] Bài 12 : Dữ liệu kiểu con trỏ (pointer)

---------------------------------
* TÓM TẮT LÝ THUYẾT
---------------------------------

1. 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ó.

2. 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;

3. 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.

4. 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].

5. 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Ụ
---------------------------------

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>

//Khai bao 1 node

using namespace std;

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

Một số tài liệu và khoá học bổ ích dành cho bạn: 

# Giáo Trình: Kỹ Thuật Lập Trình C/C++ Căn Bản Và Nâng Cao [Click để xem]

# Khoá học online: Học lập trình C/C++ TỪ A - Z [Click để xem]


------------------------
Xem bài khác: