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 đủ
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:
bai_giang_ky_thuat_lap_trinh_chuong_7_con_tro_tran_quang.pdf

