Bài giảng Kỹ thuật lập trình C: Bài 7 Con trỏ và cấp phát bộ nhớ động, cung cấp cho người học những kiến thức như: Con trỏ và địa chỉ; Cấp phát và giải phóng bộ nhớ động. Mời các bạn cùng tham khảo!
Trang 1KỸ THUẬT LẬP TRÌNH C
BÀI 7: CON TRỎ VÀ CẤP PHÁT BỘ NHỚ ĐỘNG
Hoàng Quốc Tuấn tuanhq@fpt.edu.vn http://hoangquoctuanpro.wordpress.com
Hoàng Quốc Tuấn tuanhq@fpt.edu.vn http://hoangquoctuanpro.wordpress.com
Trang 3I – Con trỏ và địa chỉ
1 Toán tử địa chỉ
2 Con trỏ
3 Quy tắc sử dụng con trỏ
Trang 41 – Toán tử địa chỉ
Các khái niệm liên quan đến biến
Địa chỉ của biến
Khái niệm
Phân loại địa chỉ biến
Phép lấy địa chỉ của một biến
Trang 51.1 – Các khái niệm liên quan đến biến
Liên quan đến biến có ba khái niệm:
Trang 61.2 – Địa chỉ của biến
Khái niệm
Khi khai báo “int a = 15 ;”
− Máy sẽ cấp phát cho biến a một khoảng nhớ
gồm 2 bytes liên tiếp (kích thước kiểu int là 2
bytes)
− Địa chỉ của biến là số thứ tự của byte đầu tiên
được cấp cho biến
Trang 71.2 – Địa chỉ của biến
Phân loại địa chỉ biến
− Địa chỉ của hai biến kiểu int liên tiếp cách
Trang 81.2 – Địa chỉ của biến
Phép lấy địa chỉ của một biến
− Toán tử một ngôi & cho ta địa chỉ của một
đối tượng.
− Phép toán & chỉ áp dụng cho các đối tượng
trong bộ nhớ, đó là các biến và các phần tử
mảng
− Toán tử & không áp dụng cho các biểu
thức, các hằng và các biến có kiểu register
Trang 92 – Con trỏ
Khái niệm biến con trỏ
Phân loại con trỏ
Khai báo biến con trỏ
Hằng con trỏ
Trang 102.1 – Khái niệm biến con trỏ
Con trỏ là một loại biến dùng để lưu
địa chỉ
Mỗi loại địa chỉ sẽ có một kiểu con trỏ
tương ứng (phụ thuộc vào loại dữ liệu
lưu trữ trong địa chỉ đó)
Trang 112.2 – Phân loại con trỏ
Tùy thuộc vào kiểu biến mà con trỏ trỏ
đến, ta phân loại được các con trỏ.
Con trỏ kiểu int chứa địa chỉ các biến
kiểu int, con trỏ kiểu float chứa địa chỉ
của các biến kiểu float,
Trang 122.3 – Khai báo biến con trỏ
Con trỏ không kiểu
− Con trỏ không kiểu có thể chứa bất kỳ
Trang 132.3 – Khai báo biến con trỏ
Con trỏ có kiểu
− Con trỏ có kiểu chỉ chứa những địa chỉ
của loại dữ liệu phù hợp với kiểu dữ liệu
mà ta đã khai báo cho con trỏ.
Trang 142.4 – Hằng con trỏ
Đối với các biến, từ khóa const dùng để khai báo
và khởi đầu giá trị cho các biến mà sau này giá trị của nó không được phép thay đổi bởi các
lệnh trong chương trình Chúng được gọi là các
đối tượng hằng
Đối với con trỏ, từ khóa const được dùng để khai
báo các đối số con trỏ mà trong thân hàm ta
không được phép thay đổi giá trị các đối tượng được trỏ bởi các đối tượng này.
Trang 16// Sai, khong duoc thay doi gia tri cua bien
}
Trang 173 – Quy tắc sử dụng con trỏ
Tên con trỏ
Các phép toán trên con trỏ
Toán tử *
Trang 193.2 - Các phép toán trên con trỏ
Phép gán
Phép tăng giảm địa chỉ
Phép so sánh
Toán tử *
Trang 203.2 - Các phép toán trên con trỏ
Trang 213.2 - Các phép toán trên con trỏ
Phép tăng giảm địa chỉ
Trang 223.2 - Các phép toán trên con trỏ
Phép so sánh
− C cho phép so sánh các con trỏ cùng kiểu.
− Nếu p1 và p2 là hai con trỏ thì:
p1 < p2 nếu địa chỉ p1 trỏ tới thấp hơn địa chỉ p2
Trang 233.2 - Các phép toán trên con trỏ
int * pi ; // khai báo con trỏ
pi = & x ; // con trỏ pi trỏ đến biến x
y = * pi ; // y gán bằng giá trị của x
* pi = 0 ; // gán x bằng 0;
pi = & z [ 10 ]; // pi trỏ đến biến z[10]
Trang 24II – Cấp phát bộ nhớ động
Khái niệm biến động
Cấp phát và giải phóng bộ nhớ động
Trang 251 – Khái niệm biến động
Biến động là các biến được tạo ra lúc
chạy chương trình, tùy theo nhu cầu mà
ta cấp phát bộ nhớ cho nó.
Các biến động không có tên (vì việc đặt
tên là gán cho nó một địa chỉ xác định).
Trang 261 – Khái niệm biến động
Việc tạo ra biến động và xóa nó đi được thực hiện nhờ các hàm malloc() và free()
của thư viện stdlib.h hoặc alloc.h
Việc truy cập đến biến động được thực
hiện nhờ vào các biến con trỏ
Trang 271 – Khái niệm biến động
Ví dụ:
int *p; // khai báo con trỏ
p = (int*) malloc(100);
//tạo biến động
Đoạn chương trình này cấp phát 100 bytes
trong bộ nhớ và gán địa chỉ khối bộ nhớ này
cho con trỏ p 100 bytes này được dùng lưu
trữ 50 số nguyên
Trang 281 – Khái niệm biến động
Ví dụ:
int * p ; // khai báo con trỏ
p = (int*) malloc( 80 * sizeof(int));
//tạo biến động
Đoạn chương trình này cấp phát bộ nhớ và gán
địa chỉ khối bộ nhớ này cho con trỏ p Khối vùng
nhớ này lưu trữ dược 80 số int.
Hàm sizeof ( kiểu ) trả về kích thước (byte) của kiểu
dữ liệu đối số
Trang 291 – Khái niệm biến động
Ví dụ:
char * cp ; // khai báo con trỏ
cp = (char*) malloc( 75 * sizeof(char));
//tạo biến động
Đoạn chương trình này cấp phát bộ nhớ và gán
địa chỉ khối bộ nhớ này cho con trỏ cp Khối vùng
nhớ này lưu trữ dược 75 ký tự.
Trang 32printf( “khong du bo nho” );
exit( 1 );
}
printf( “Da cap bo nho” );
Trang 33Kiểu datatype có thể là những kiểu dữ liệu mới
do người lập trình tạo ra
Trang 34unsigned int tuoi;
unsigned int diem;
Trang 362.4 – Giải phóng bộ nhớ bằng free
Cú pháp:
void free (void *prt)
Chức năng: giải phóng vùng nhớ được trỏ
bởi con trỏ ptr Nếu prt = NULL thì free
không làm gì cả.
Trang 37printf ( “Nhap so phan tu: ” );
Trang 392.5 – Các ví dụ
Ví dụ 1: Dùng hàm malloc cấp phát bộ nhớ cho một chuỗi ký tự.
Ví dụ 2: Dùng hàm calloc cấp phát bộ nhớ cho một chuỗi ký tự.
Ví dụ 3: Dùng hàm realloc cấp phát lại bộ nhớ cho một chuỗi ký tự.
Trang 40printf ( “Chuoi ky tu la: %s” , str );
Ví dụ 1: Dùng hàm malloc cấp phát bộ nhớ cho một chuỗi ký tự.
Trang 43Hỏi - Đáp
Hoàng Quốc Tuấn tuanhq@fpt.edu.vn http://hoangquoctuanpro.wordpress.com
Hoàng Quốc Tuấn tuanhq@fpt.edu.vn http://hoangquoctuanpro.wordpress.com
BÀI 7: CON TRỎ VÀ CẤP PHÁT BỘ NHỚ ĐỘNG