Bài giảng Kỹ thuật lập trình - Chương 7: Con trỏ - Trần Quang

Chương 07  
CON TRỎ  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
1
Nội dung  
Tổ chức bộ nhớ  
Ứng dụng của con trỏ  
Mô hình của con trỏ  
Toán tử &  
Con trỏ và cấu trúc,  
toán tử ->  
Các chủ đề nâng cao  
với con trỏ  
Thứ tự đánh giá *  
Khai báo trỏ  
và ++, --  
Toán tử *  
Con trỏ và const  
Con trỏ đến con trỏ  
Con trỏ void  
Cá c phé p toá n  
Con trỏ và mảng  
Cấp phát bộ nhớ động  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
2
Tổ chức bộ nhớ thực thi  
Tổ chức bộ nhớ  
khi chương  
trì nh nạp vào để  
thực thi  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
3
Tổ chức bộ nhớ thực thi  
Vùng TEXT  
Chứa mã thực thi của  
chương trình  
Vùng này chỉ đọc  
Có thể dùng chung  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
4
Tổ chức bộ nhớ thực thi  
Vùng DATA  
Dữ liệu đã được khởi  
tạo (initialized)  
Dữ liệu khô ng được  
khởi tạo (uninitialzed)  
gồm:  
Biến toàn cục  
Biến tĩnh (static)  
Hằng chuỗi  
(Nguồn: http://proprogramming.org/)  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
5
Tổ chức bộ nhớ thực thi  
Vùng HEAP  
Chứa bộ nhớ xin  
cấp phát động bởi  
người lập trì nh  
Liên quan đến kiểu  
dữ liệu con trỏ trong  
chương này  
(Nguồn: http://cphroprtrloeg.crcasmu.medinug/.)org/)  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
6
Tổ chức bộ nhớ thực thi  
Vùng STACK  
Chứa cá c biến  
khai bá o trong  
chương trình  
Thô ng tin cá c  
lần gọi hàm  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
7
Ứng dụng của con trỏ  
Mảng trong C  
Phải biết trước số lượng phần tử tại thời điểm viết  
chương trình  
Do đó, cần phải khai báo một số lượng lớn các ô  
nhớ để sẵn. Tuy nhiên, tại một thời điểm nào đó,  
chương trình có thể sẽ sử dụng ít hơn rất nhiều  
lã ng phí  
Yêu cầu: có thể nào dùng mảng với số lượng phần  
tử chỉ cần biết lúc chương trình đang chạy?  
=> Dùng con trỏ  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
8
Ứng dụng của con trỏ  
Mảng trong C  
Khi thêm vào và xó a các phần tử trên mảng, cần  
phải dịch phải và trái nhiều phần tử tốn nhiều  
thời gian  
Yêu cầu: Có cách tổ chức dữ liệu nào giúp các  
phép quản lý phần tử nói trên nhanh chó ng  
Giải pháp:  
Sử dụng danh sách liên kết dùng con trỏ  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
9
Mô hình của con trỏ  
Biến a có địa chỉ là  
0x1234 FFFF  
0x1234 FFFF  
Biến p là con trỏ  
chứa địa chỉ của biến a  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
10  
Toán tử &  
Dùng để lấy địa chỉ của một biến  
Ví dụ:  
int a = 100;  
printf("%d\n", a);  
printf("%p\n", &a);  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
11  
Toán tử &  
typedef struct sPoint3D{float x, y, z;} Point3D;  
void main(){  
Point3D p1 = {1.0f, 2.0f, 3.0f};  
printf("%-5.1f\n", p1.x);  
In ra địa chỉ của p1  
printf("%p\n", &p1);  
In ra giá trị của p1.x  
printf("%p\n", &p1.x);  
In ra địa chỉ của p1.y  
printf("%p\n", &p1.y);  
In ra địa chỉ của p1.z  
printf("%p\n", &p1.z);  
}
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
12  
Khai báo con trỏ  
<Tên kiểu> *<tên biến>;  
<Tên kiểu> *<tên biến> = 0; //NULL  
<Tên kiểu> *<tên biến> = &<tên biến b>;  
Ví dụ:  
int a; // biến số nguyên  
int *p1; // con trỏ đến số nguyên, giá trị chưa xác định  
int *p2 = 0; // con trỏ đến số nguyên, giá trị là NULL  
int *p3 = &a; // con trỏ đến số nguyên, giá trị là địa chỉ  
của biến a  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
13  
Toán tử *  
Toán tử * lấy giá trị (tham khảo) tại một địa chỉ  
Ví dụ:  
int a = 100;  
int *p;  
p = &a;  
printf("a : %d\n", a);  
printf("&a : %p\n", &a);  
printf("p : %p\n", p);  
printf("*p : %d\n", *p);  
printf("*&a: %d\n", *&a);  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
14  
Chương 06:Con trỏ  
Các phép toán trên con trỏ  
Tăng, giảm: ++, --  
Cộng, trừ: +, -  
Cộng, trừ kết hợp gán: +=, -=  
So sá nh: ==, !=  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
15  
Các phép toán trên con trỏ  
Gọi p là con trỏ có kiểu T;  
Cá c phé p cộng, trừ: làm con trỏ p tăng hay giảm  
một bội số của kích thước kiểu T  
Ví dụ:  
int a = 100;  
int *p = &a;  
printf("p : %p\n", p);  
p++;  
printf("p : %p\n", p);  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
16  
Chương 06:Con trỏ  
Con trỏ và mảng  
Con trỏ và mảng có nhiều điểm giống nhau. Cả 2  
đều giữ địa chỉ của ô nhớ  
Con trỏ: giữ địa chỉ của một ô nhớ nào đó  
Mảng: giữ địa chỉ của phần tử đầu tiên  
Do đó:  
Có thể gán mảng vào con trỏ  
Nhưng không thể gán con trỏ vào mảng  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
17  
Chương 06:Con trỏ  
Con trỏ và mảng  
Ví dụ:  
Gán mảng vào con trỏ  
a và p giữ cùng địa chỉ là địa  
chỉ phần tử đầu tiên của mảng  
int a[5];  
int *p = a;  
printf ("a =%p\n", a);  
printf ("p =%p\n", p);  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
18  
Chương 06:Con trỏ  
Con trỏ và mảng  
Con trỏ và mảng có cùng cá ch truy cập các ô nhớ  
Dùng toán tử [ ]  
Dùng toán tử * và +  
int a[5];  
int *p = a;  
int id = 2;  
a[id] = 100;  
p[id] = 100;  
Giống nhau  
*(a + id) = 100;  
*(p + id) = 100;  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
Chương 06:Con trỏ  
19  
Con trỏ và mảng  
Con trỏ và mảng cũng có điểm khác nhau:  
Mảng: các phần tử của mảng nằm trên STACK  
Con trỏ: Các phần tử mảng con trỏ chỉ đến có thể  
trên STACK hay HEAP  
Trần Quang  
© 2016  
Kỹ thuật lập trình  
20  
Chương 06:Con trỏ  
Tải về để xem bản đầy đủ
pdf 28 trang Thùy Anh 14120 Free
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Chương 7: Con trỏ - Trần Quang", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_chuong_7_con_tro_tran_quang.pdf