ĐẠI HỌC QUỐC GIA TP. HCHÍ MINH
TRƯỜNG ĐI HỌC CÔNG NGHTHÔNG TIN
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
IT001
-
NHẬP N LẬP TRÌNH
CHƯƠNG 8: CON TRỎ
Khoa Khoa học Máy tính
S dng c o n t r l à m t trong nhng k t h u t q u a n t r ng trong l p t r ì n h , đ c b i t là t r o n g c á c c h ư ơ n g tr ình
đ ư c x â y d n g bng ngô n n g lp tr ình C/ C + + c ó l i ê n q u a n đ ế n vi c q u n l ý b nh c a c á c b i ế n , c p p h á t v à
t h u h i vùng n h trong quá t r ì nh th c t h i c h ư ơ ng trình . C o n tr h tr c h ư ơ n g t r ì nh t h c t h i n h a n h h ơ n , s
d n g t à i n guyên máy tí nh h i u q u h ơ n .
June 2024
1
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
8.1 Tổ chức quản lưu trữ trong bộ nhớ
8.2 Khái niệm con trỏ
8.3 Vai trò, tầm quan trọng của con trỏ
8.4 Khai báo khởi tạo biến con trỏ
8.5 Các phép toán trên con trỏ
8.6 Con trỏ kiểu void
8.7 Con trỏ nullptr
8.8 Từ khóa const con trỏ
NỘI DUNG
June 2024
8.9 Con trỏ mảng một chiều
8.10 Con trỏmảng hai chiều
8.11 Cấp phát giải phóng ô nhớ
8.12 Mảng một chiều cấp phát động
8.13 Con trỏ cấp phát động chuỗi
8.14 Mảng hai chiều cấp phát động
8.15 Con trỏ hàm số
Bài tập
2
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
8.1 Tổ chức quản lưu trữ trong bộ nhớ
8.2 Khái niệm con trỏ
8.3 Vai trò, tầm quan trọng của con trỏ
8.4 Khai báo khởi tạo biến con trỏ
8.5 Các phép toán trên con trỏ
8.6 Con trỏ kiểu void
8.7 Con trỏ nullptr
8.8 Từ khóa const con trỏ
NỘI DUNG
June 2024
8.9 Con trỏ mảng một chiều
8.10 Con trỏmảng hai chiều
8.11 Cấp phát giải phóng ô nhớ
8.12 Mảng một chiều cấp phát động
8.13 Con trỏ cấp phát động chuỗi
8.14 Mảng hai chiều cấp phát động
8.15 Con trỏ hàm số
Bài tập
3
8.1 T chc qun lý lưu tr trong b nh
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
4
Biến
vùng
nhớ
Bộ nhớ máy tính
o Bộ nhớ RAM chứa rất nhiều ô nhớ,
mỗi ô nhớkích thước 1 byte.
o Mỗi ô nhớ địa chỉ duy nhất địa
chỉ này được đánh số từ 0 trở đi.
o RAM để lưu trữ chương trình
dữ liệu trong suốt quá trình thực thi.
Thc hin bi Trường Đi hc Công ngh Thông tin, ĐHQG-HCM
Memory Layout (bytes)
.
.
.
0
1
2
3
4
5
6
7
.
.
.
Địa chỉ
ô nhớ
1 byte
June 2024
5
Biến
vùng
nhớ
Khi khai báo biến, máy tính sẽ dành riêng một vùng nhớ để
lưu biến đó.
Khi tên biến được gọi, máy tính sẽ thực hiện 2 bước sau:
Tìm kiếm địa chỉ ô nhớ của biến.
Truy xuất hoặc thiết lập giá trị của biến được lưu trữ tại ô
nhớ đó.
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
6
Biến vùng nhớ
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
int main() {
char ch=‘x’;
int a = 7;
}
Memory Layout (bytes)
.
.
.
0
1
2
3
4
5
6
7
.
.
.
Địa chỉ
ô nhớ
ch
a
x
7
June 2024
7
8.2 Khái nim con tr
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
8
8.2 Khái niệm con trỏ
Khái niệm:
Con trỏ (Pointer) một biến lưu trữ địa chỉ của một địa chỉ bộ
nhớ.
Ví dụ: Biến x chứa địa chỉ của biến y. Vậy ta nói biến x “trỏ tớiy.
Phân loại con trỏ:
Con trỏ kiểu int dùng để chứa địa chỉ của các biến kiểu int. Tương
tự ta có con trỏ kiểu float, double,
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
June 2024
9
8.3 Vai trò, tm quan trng ca con tr
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
10
8.3 Vai trò, tầm quan trọng của con trỏ
Quản bộ nhớ: Con trỏ cho phép lập trình viên cấp phát giải phóng bộ nhớ
thủ công, tối ưu hóa việc sử dụng bộ nhớ tránh lãng phí.
Truy cập trực tiếp: Con trỏ cho phép truy cập trực tiếp vào các ô nhớ, giúp thao
tác dữ liệu nhanh chóng hiệu quả.
Khả năng linh hoạt: Con trỏ giúp truy cập các cấu trúc dữ liệu phức tạp như DSLK,
y.
Lưu ý:
Nguy rỉ bộ nhớ: Cần giải phóng bộ nhớ đúng cách để tránh rỉ.
Lỗi truy cập vùng nhớ: Sử dụng con trỏ sai thể dẫn đến lỗi chương trình.
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
11
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
8.1 Tổ chức quản lưu trữ trong bộ nhớ
8.2 Khái niệm con trỏ
8.3 Vai trò, tầm quan trọng của con trỏ
8.4 Khai báo khởi tạo biến con trỏ
8.5 Các phép toán trên con trỏ
8.6 Con trỏ kiểu void
8.7 Con trỏ nullptr
8.8 Từ khóa const và con trỏ
8.9 Con trỏmảng một chiều
8.10 Con trỏmảng hai chiều
Bài tập
NỘI DUNG
June 2024
12
8.4 Khai báo và khi to biến con tr
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
13
Khai
báo
con
trỏ
Khai báo
Giống như mọi biến khác, biến con trỏ muốn sử dụng cũng cần phải
được khai báo.
dụ
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
<kiểu dữ liệu> *<tên biến con trỏ>;
char char1;
int *ptrI;
float *ptrF;
char1
0x50
ptrF
0x10
ptrI
0x80
Memory Layout
June 2024
14
Từ khóa typedef
thể đặt tên cho kiểu dữ liệu con trỏ dùng typedef
dụ: typedef int* IntPtr;
Các khai báo sau tương đương:
IntPtr p;
int *p;
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
15
Khởi tạo giá trị con trỏ
Toán tử & dùng trong khởi tạo giá trị cho con trỏ
dụ:
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
<kiểu dữ liệu> *<tên biến con trỏ> = & <tên biến>;
int a;
int *ptr = &a;
double a;
int *ptr = &a;
?
0x34
ptr
0x90
Memory Layout
a
0x34
June 2024
16
8.5 Các phép toán trên con tr
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
17
8.5 Các phép toán trên con trỏ
8.5.1 Con trỏ và toán tử &, *
8.5.2 Toán tử sizeof
8.5.3 Phép gán con trỏ
8.5.4 Phép toán số học trên con trỏ
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
18
8.5.1 Con trỏ toán tử &, *
Toán tử & (Address-of Operator) đặt trước tên biến cho biết địa chỉ
của vùng nhớ của biến.
Toán tử * (Dereferencing Operator hay Indirection Operator) đặt trước
một địa chỉ và cho biết giá trị lưu trữ tại địa chỉ đó.
Tương tự, ta sẽ :
Toán tử & đặt trước tên biến con trỏ cho biết địa ch của vùng nhớ của
biến.
Toán tử * đặt trước biến con trỏ cho phép truy xuất đến giá
trị ô nhớ mà con trỏ trỏ đến.
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024
19
8.5.1 Con trỏ toán tử &, *
cout << " value = " << value;
=> value = 3200;
cout << " &value = " << &value;
=> &value = 0x50;
cout << " *(&value) = " << *(&value);
=> *(&value) = 3200;
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM
int value;
value = 3200;
3200
value
0x50
Memory Layout
June 2024
20

Preview text:

ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC CÔNG NGHỆ THÔNG TIN
IT001 - NHẬP MÔN LẬP TRÌNH CHƯƠNG 8: CON TRỎ
S ử d ụ n g c o n t r ỏ l à m ộ t t r o n g n h ữ n g k ỹ t h u ậ t q u a n t r ọ n g t r o n g l ậ p t r ì n h , đ ặ c b i ệ t l à t r o n g c á c c h ư ơ n g t r ì n h
đ ư ợ c x â y d ự n g b ằ n g n g ô n n g ữ l ậ p t r ì n h C / C + + c ó l i ê n q u a n đ ế n v i ệ c q u ả n l ý b ộ n h ớ c ủ a c á c b i ế n , c ấ p p h á t v à
t h u h ồ i v ù n g n h ớ t r o n g q u á t r ì n h t h ự c t h i c h ư ơ n g t r ì n h . C o n t r ỏ h ỗ t r ợ c h ư ơ n g t r ì n h t h ự c t h i n h a n h h ơ n , s ử
d ụ n g t à i n g u y ê n m á y t í n h h i ệ u q u ả h ơ n .
Khoa Khoa học Máy tính
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 1 NỘI DUNG
8.1 Tổ chức quản lý lưu trữ trong bộ nhớ
8.9 Con trỏ và mảng một chiều 8.2 Khái niệm con trỏ
8.10 Con trỏ và mảng hai chiều
8.3 Vai trò, tầm quan trọng của con trỏ
8.11 Cấp phát và giải phóng ô nhớ
8.4 Khai báo và khởi tạo biến con trỏ
8.12 Mảng một chiều cấp phát động
8.5 Các phép toán trên con trỏ
8.13 Con trỏ cấp phát động và chuỗi 8.6 Con trỏ kiểu void
8.14 Mảng hai chiều cấp phát động 8.7 Con trỏ nullptr 8.15 Con trỏ và hàm số
8.8 Từ khóa const và con trỏ Bài tập June 2024
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM 2 NỘI DUNG
8.1 Tổ chức quản lý lưu trữ trong bộ nhớ
8.9 Con trỏ và mảng một chiều 8.2 Khái niệm con trỏ
8.10 Con trỏ và mảng hai chiều
8.3 Vai trò, tầm quan trọng của con trỏ
8.11 Cấp phát và giải phóng ô nhớ
8.4 Khai báo và khởi tạo biến con trỏ
8.12 Mảng một chiều cấp phát động
8.5 Các phép toán trên con trỏ
8.13 Con trỏ cấp phát động và chuỗi 8.6 Con trỏ kiểu void
8.14 Mảng hai chiều cấp phát động 8.7 Con trỏ nullptr 8.15 Con trỏ và hàm số
8.8 Từ khóa const và con trỏ Bài tập June 2024
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM 3
8.1 Tổ chức quản lý lưu trữ trong bộ nhớ
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 4 Biến và vùng nhớ Bộ nhớ máy tính Địa chỉ 1 byte ô nhớ
o Bộ nhớ RAM chứa rất nhiều ô nhớ, 0 1
mỗi ô nhớ có kích thước 1 byte. 2
o Mỗi ô nhớ có địa chỉ duy nhất và địa 3 4
chỉ này được đánh số từ 0 trở đi. 5
o RAM để lưu trữ mã chương trình và 6 7
dữ liệu trong suốt quá trình thực thi. . . . . . . … Memory Layout (bytes)
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 5 Biến và vùng nhớ
• Khi khai báo biến, máy tính sẽ dành riêng một vùng nhớ để lưu biến đó.
➢Khi tên biến được gọi, máy tính sẽ thực hiện 2 bước sau:
Tìm kiếm địa chỉ ô nhớ của biến.
Truy xuất hoặc thiết lập giá trị của biến được lưu trữ tại ô nhớ đó.
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 6 Biến và vùng nhớ Địa chỉ ô nhớ 0 1 x ch 2 3 a int main() { 4 char ch=‘x’; 7 5 int a = 7; 6 } 7 . . . . . . … Memory Layout (bytes)
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 7
8.2 Khái niệm con trỏ
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 8
8.2 Khái niệm con trỏKhái niệm:
• Con trỏ (Pointer) là một biến lưu trữ địa chỉ của một địa chỉ bộ nhớ.
• Ví dụ: Biến x chứa địa chỉ của biến y. Vậy ta nói biến x “trỏ tới” y.
Phân loại con trỏ:
• Con trỏ kiểu int dùng để chứa địa chỉ của các biến kiểu int. Tương
tự ta có con trỏ kiểu float, double, …
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 9
8.3 Vai trò, tầm quan trọng của con trỏ
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 10
8.3 Vai trò, tầm quan trọng của con trỏ
Quản lý bộ nhớ: Con trỏ cho phép lập trình viên cấp phát và giải phóng bộ nhớ
thủ công, tối ưu hóa việc sử dụng bộ nhớ và tránh lãng phí.
Truy cập trực tiếp: Con trỏ cho phép truy cập trực tiếp vào các ô nhớ, giúp thao
tác dữ liệu nhanh chóng và hiệu quả.
Khả năng linh hoạt: Con trỏ giúp truy cập các cấu trúc dữ liệu phức tạp như DSLK, cây. • Lưu ý:
Nguy cơ rò rỉ bộ nhớ: Cần giải phóng bộ nhớ đúng cách để tránh rò rỉ.
Lỗi truy cập vùng nhớ: Sử dụng con trỏ sai có thể dẫn đến lỗi chương trình.
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 11 NỘI DUNG
8.1 Tổ chức quản lý lưu trữ trong bộ nhớ 8.2 Khái niệm con trỏ
8.3 Vai trò, tầm quan trọng của con trỏ
8.4 Khai báo và khởi tạo biến con trỏ
8.5 Các phép toán trên con trỏ 8.6 Con trỏ kiểu void 8.7 Con trỏ nullptr
8.8 Từ khóa const và con trỏ
8.9 Con trỏ và mảng một chiều
8.10 Con trỏ và mảng hai chiều Bài tập June 2024
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM 12
8.4 Khai báo và khởi tạo biến con trỏ
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 13 Khai báo con trỏ • Khai báo
• Giống như mọi biến khác, biến con trỏ muốn sử dụng cũng cần phải được khai báo. *; • Ví dụ Memory Layout 0x50 char char1; char1 0x80 int *ptrI; ptrI float *ptrF; 0x10 ptrF
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 14 Từ khóa typedef
• Có thể đặt tên cho kiểu dữ liệu con trỏ dùng typedef
• Ví dụ: typedef int* IntPtr;
➔ Các khai báo sau tương đương: IntPtr p; int *p;
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 15
Khởi tạo giá trị con trỏ
• Toán tử & dùng trong khởi tạo giá trị cho con trỏ * = & ; • 0x34 Ví dụ: a int a; 0x90 int *ptr = &a; ptr 0x34 Memory Layout double a; int *ptr = &a; ?
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 16
8.5 Các phép toán trên con trỏ
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 17
8.5 Các phép toán trên con trỏ
8.5.1 Con trỏ và toán tử &, * 8.5.2 Toán tử sizeof 8.5.3 Phép gán con trỏ
8.5.4 Phép toán số học trên con trỏ
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 18
8.5.1 Con trỏ và toán tử &, *
• Toán tử & (Address-of Operator) đặt trước tên biến và cho biết địa chỉ
của vùng nhớ của biến.
• Toán tử * (Dereferencing Operator hay Indirection Operator) đặt trước
một địa chỉ và cho biết giá trị lưu trữ tại địa chỉ đó. • Tương tự, ta sẽ có:
• Toán tử & đặt trước tên biến con trỏ cho biết địa chỉ của vùng nhớ của biến.
• Toán tử * đặt trước biến con trỏ cho phép truy xuất đến giá
trị ô nhớ mà con trỏ trỏ đến.
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 19
8.5.1 Con trỏ và toán tử &, * int value; 0x50 value value = 3200; 3200 Memory Layout
cout << " value = " << value; => value = 3200;
cout << " &value = " << &value; => &value = 0x50;
cout << " *(&value) = " << *(&value); => *(&value) = 3200;
Thực hiện bởi Trường Đại học Công nghệ Thông tin, ĐHQG-HCM June 2024 20