You are on page 1of 13

TIN HỌC CƠ SỞ 2

CON TRỎ

Giảng viên : ThS. PHAN NGHĨA HIỆP


Khoa : CÔNG NGHỆ THÔNG TIN 2
Bộ môn : AN TOÀN THÔNG TIN
Điện thoại/ Email : hieppn@ptithcm.edu.vn
1
&
VC
BB
Nội dung

1 Khái niệm 5 Cấp phát bộ nhớ động

2 Con trỏ → biến 6 C++: con trỏ & mảng

3 C++: Sử dụng con trỏ C++: tăng giảm biến


7 con trỏ

4 Con trỏ trong tham số


của hàm 8 C++: Con trỏ hàm

2
Con trỏ
3
&
VC
BB Khái niệm

Con trỏ là một biến lưu địa chỉ, chỉ đến một biến,
một hàm hoặc một vùng nhớ được cấp cho
chương trình.
Mục đích sử dụng của con trỏ:
1. Để giao tham số cho hàm theo kiểu tham chiếu.
• Cho phép hàm cập nhật trực tiếp vào tham số.
• Thay cho tham số là biến có kích thước rất lớn (ví dụ string).
2. Để xin cấp phát thêm bộ nhớ cho chương trình.
3. Để truy xuất đến từng phần tử của một mảng (array),
hoặc một xâu liên kết (linking list).
4. Để chuyển giao hàm như một tham số (con trỏ hàm)
3
Con trỏ
4
&
VC
BB
Con trỏ → biến
 Biến là một vùng nhớ có địa chỉ xác định trong bộ nhớ.
Con trỏ → biến X là địa chỉ của biến X.
int n = 5;
int *pint; // pint là một biến con trỏ, trỏ đến kiểu int
pint = &n; // pint chứa địa chỉ của biến n
*pint = biến n đang được pint trỏ đến (*pint = n = 5)
n:
0 5 20 75
1772 1776 1780 1784

pint = &n “pint đang trỏ đến biến n”

pint: 1776
4
6323 Con trỏ
5
&
VC
BB C++: Sử dụng con trỏ
// file vd30.cpp A = 10
#include <iostream> B = 20
using namespace std;
int main ()
{ int A, B;  A, B là kiểu nguyên thì (*p)
int * p; phải là kiểu nguyên !
// gan gia tri cho A va B:  Điều gì sẽ xảy ra nếu khai
báo: char *p thay vì int *p ?
p = &A; *p = 10;
 Điều gì sẽ xảy ra nếu khai
p = &B; *p = 20;
báo: long *p thay vì int *p ?
cout << "\n A = " << A;
cout << "\n B = " << B;
return 0;
} Con trỏ
5
6
&
VC
BB Con trỏ trong tham số của hàm
 Ví dụ 1:  Ví dụ 2:
string concat(string a, string b)string concat(const string &a,
{ return a+b; // c++ string const string &b)
} { return a+b;
}
 Đây là cách gọi hàm chuyển  Thay vì dùng tham số là biến
giao giá trị. Kích thước của 2 chuỗi, ví dụ này dùng tham số
tham số a và b là kích thước là địa chỉ của biến chuỗi (&a,
của 2 chuỗi (rất lớn). &b) nên chúng có kích thước
nhỏ hơn nhiều.
 Từ khóa const dùng để ngăn
chặn sự thay đổi lên biến
tham số trong hàm concat.
6
Con trỏ
7
&
VC
BB Cấp phát bộ nhớ động
 Trong các ví dụ trước, các biến được khai báo có kích thước cố
định, có thể đưa đến 2 tình huống:
1. Kích thước biến quá nhỏ, không đủ giá trị cho biến.
2. Kích thước biến quá lớn, dùng không hết.

 Cách hợp lý là xin cấp bộ nhớ cho biến chỉ vừa đủ dùng. Con
trỏ được dùng để chỉ đến khối bộ nhớ được cấp phát.

 Ví dụ:
int Sz = 5; // vào lúc này, chương trình cần 5 số nguyên
int *p = new int [Sz]; // xin cấp 5 biến số nguyên liên tục
delete [ ] p; // giải phóng bộ nhớ đã cấp khi không cần nữa.

 Cơ chế này được gọi là cấp phát bộ nhớ động (dynamic


memory allocation). Con trỏ
7
8
&
VC
BB Mảng (1 chiều)
 Mảng:
 Là một dãy gồm nhiều phần tử giống nhau và liên tiếp
nhau trong bộ nhớ.
 Mỗi phần tử có vị trí cố định, và được truy xuất bằng
chỉ mục.
Ví dụ: int A[5]  mảng A có 5 phần tử số nguyên, từng
phần tử là A[0], A[1],…,A[4].

 Trong ví dụ trước, p là một con trỏ trỏ đến một mảng gồm
5 số nguyên liên tiếp nhau, đó là:
 *p, *(p+1),…,*(p+4)
 hoặc viết thành p[0], p[1],…, p[4] cũng được. 8
Con trỏ
9
&
VC
BB Mảng (1 chiều)

 Con trỏ trỏ đến mảng, và mảng được dùng giống như
nhau:
int A[5];  int *A = new int[5];
chỉ khác là:
1. Con trỏ có thể trỏ đi nơi khác, mảng thì không.
2. Cần cấp/giải phóng bộ nhớ con trỏ, mảng thì không.

9
Con trỏ
10
&
VC
BB C++: con trỏ & mảng
// file vd31.cpp A[0]=1
int main() A[1]=2
{ int A[3]; // mang A gom 3 so nguyen A[2]=3
int *p, sz = 3;
p = new int[sz]; // p chi den 1 mang 3 so nguyen
for (int i=0; i<3; i++) *(p+i) = i+1;
A[0] = *p;
*(A+1) = p[1];
*(A+2) = p[2];
delete[] p; // giai phong bo nho cap cho p
for (int i=0; i<3; i++)
cout << "\n A["<<i<<"]="<< A[i];
return 0;
10
} Con trỏ
11
&
VC
BB C++: tăng giam biến con trỏ
// file vd32.cpp Day la chuoi C chuan
// tang giam bien con tro
#include <iostream>
#include <cstring>
int main() • C tự tính số bytes cần
{ char S1[]="Day la chuoi C chuan";
tăng trong lệnh p1++
(“trỏ đến phần tử kế”)
char *S2, *p1, *p2;
S2 = new char[strlen(S1+1)];
p1 = S1; p2 = S2;
while (*p1) *p2++ = *p1++; *p2 = 0;
cout << S2;
delete[] S2;
return 0;
} Con trỏ
11
12
&
VC
BB C++: Con trỏ hàm
// file vd33.cpp n= 8
int Add(int a, int b) { return (a + b);}
int Sub(int a, int b) { return (a - b);}
int Op(int x, int y, int (*fcall)(int,int))
{ int g; g = (*fcall)(x,y);
 Địa chỉ hàm Add
return (g); được gán vào tham
} số fcall của hàm Op
int main ()  Địa chỉ hàm Minus =
{ int m,n; địa chỉ hàm Sub,
int (*Minus)(int,int) = Sub; được gán vào tham
m = Op(7, 5, Add); // 7+5=12=m số fcall
n = Op(20, m, Minus); // 20-m=8
cout <<“\n n=” <<n; return 0;
} Con trỏ
12
13

Bài tập
&
VC
BB

1. Chỉ ra chổ sai:


 int n=44; int*p = &n; ++(*p); int m = p;
 int p=new int; *p=44; int *q=p; delete p;
 int *p = new int; *p=44; int *q = new int; p = q;
 int n = new int; n=44;
2. Nhập vào một mảng gồm n số nguyên. Hãy sắp xếp các
phần tử chẵn tăng dần.
3. Nhập vào một mảng gồm n số nguyên. Hãy dồn hết các
phần tử chẵn về đầu mảng (giữ nguyên thứ tự của
chúng)
4. Nhập vào một mảng n lẽ số nguyên, tìm giá trị trung vị
(median) của mảng. Ví dụ : {1,5,2,4,3) → median = 3
13
Con trỏ

You might also like