Bài giảng Lập trình căn bản - Phần 1, Chương 7: Kiểu con trỏ

Nội dung chương này

Giới thiệu kiểu dữ liệu con trỏ

Khai báo và sử dụng biến con trỏ

Con trỏ và mảng

Con trỏ và tham số hình thức của hàm

ppt 27 trang phuongnguyen 6520
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình căn bản - Phần 1, Chương 7: Kiểu con trỏ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Lập trình căn bản - Phần 1, Chương 7: Kiểu con trỏ

Bài giảng Lập trình căn bản - Phần 1, Chương 7: Kiểu con trỏ
LẬP TRÌNH CĂN BẢN 
Phần 2 - Chương 7 
KIỂU CON TRỎ 
N .C. Danh 
1 
Nội dung chương này 
Giới thiệu kiểu dữ liệu con trỏ 
Khai báo và sử dụng biến con trỏ 
Con trỏ và mảng 
Con trỏ và tham số hình thức của hàm 
2 
Giới thiệu kiểu dữ liệu con trỏ (pointer) (1) 
1 con trỏ là 1 biến được dùng để chứa địa chỉ của ô nhớ trong bộ nhớ. 
Kích thước của biến con trỏ luôn là 2 byte. 
Ví dụ 1: 
	float a=3.145; 
	 float* ptr;	//ptr is a pointer 
	ptr=&a; 
FFF2 
3.145 
pointer ptr 
variable a 
FFF2 (address) 
3 
Giới thiệu kiểu dữ liệu con trỏ (2) 
Ví dụ 2: 
In Linux 
4 
Khai báo và sử dụng biến con trỏ 
Khai báo biến con trỏ 
Các thao tác trên con trỏ 
5 
Khai báo biến con trỏ 
	 int a, b, *pa, *pb; //pa và pb sẽ chỉ đến biến int 
	 float f, *pf; 	 //pa và pb sẽ chỉ đến biến float 
	 void *ptr; //ptr sẽ chỉ vào bất kỳ biến kiểu gì 
Cú pháp: 
	 * ; 
Ý nghĩa : Khai báo một biến có tên là Tên con trỏ dùng để chứa địa chỉ của các biến có kiểu Kiểu . 
6 
Các thao tác trên con trỏ 
Gán địa chỉ của biến cho biến con trỏ 
Nội d ung của ô nhớ con trỏ chỉ tới 
Cấp phát vùng nhớ cho biến con trỏ 
Cấp phát lại vùng nhớ cho biến con trỏ 
Giải phóng vùng nhớ cho biến con trỏ 
Một số phép toán trên con trỏ 
7 
Gán địa chỉ của biến cho biến con trỏ + Nội d ung của ô nhớ con trỏ chỉ tới (1) 
Dùng & để lấy ra địa chỉ bộ nhớ (memory address) của 1 biến 
	 int a=6; 
	 int* c= &a; // &a là địa chỉ bộ nhớ của biến a 
Dùng * để truy cập (access) đến nội dung (content) của biến mà 1 con trỏ đang chỉ đến 
	int a=6; 
	 int* c= &a; 
	*c=7;	 /*Thay đổi nội dung của biến a bằng cách 	 	 dùng địa chỉ của nó được chứa trong con trỏ c*/ 
	 tương đương với 
	a=7;	 	 
8 
Gán địa chỉ của biến cho biến con trỏ + Nội d ung của ô nhớ con trỏ chỉ tới (2) 
9 
Gán địa chỉ của biến cho biến con trỏ + Nội d ung của ô nhớ con trỏ chỉ tới (3) 
Lưu ý: 
	 => Error! 
	 Vì đã cho 1 con trỏ chỉ đến 1 biến khác 	kiểu với nó 
10 
Cấp phát vùng nhớ cho biến con trỏ(1) 
Có 2 cách để dùng được biến con trỏ 
Cho nó chứa địa chỉ của 1 vùng nhớ đang tồn tại 
	 int a=6; 
	 int* c= &a; // &a là địa chỉ bộ nhớ của biến a 
Cấp phát 1 vùng nhớ mới, rồi cho con trỏ chỉ đến 
	 int* ptr; 
	ptr = (int*) malloc(sizeof( int )); 
	*ptr=6; 
FFFA 
6 
pointer ptr 
FFFA (address) 
11 
Cấp phát vùng nhớ cho biến con trỏ(2) 
void *malloc(size_t size) : Cấp phát vùng nhớ có kích thước là size (byte) 
void *calloc(size_t nitems, size_t size) : Cấp phát vùng nhớ có kích thước là nitems*size (byte) 
Ví dụ: 
	 int a, *pa, *pb; 
	pa = (int*) malloc(sizeof( int )); /* Cấp phát vùng nhớ có kích thước 	bằng với kích th ướ c của một số nguyên */ 
	pb= (int*) calloc(10, sizeof( int )); /* Cấp phát vùng nhớ có thể chứa 	được 10 số nguyên*/ 
12 
Cấp phát lại vùng nhớ cho biến con trỏ 
	int a, *pa; 
	pa = (int*) malloc(sizeof( int )); /*Cấp phát vùng nhớ có 	 kích thước 2 byte*/ 
	pa = realloc(pa, 6); 	 	 /*Cấp phát lại vùng nhớ có 	kích thước mới là 6 byte*/ 
void *realloc(void *block, size_t size): 
Ý nghĩa : 
Cấp phát lại 1 vùng nhớ do con trỏ block quản lý, vùng nhớ này có kích thước mới là size ; khi cấp phát lại thì nội dung vùng nhớ trước đó được copy đến vùng nhớ mới. 
Kết quả trả về của hàm là địa chỉ đầu tiên của vùng nhớ mới . Địa chỉ này có thể khác với địa chỉ được chỉ ra khi cấp phát ban đầu. Kết quả là NULL nếu không cấp phát được . 
13 
Giải phóng vùng nhớ cho biến con trỏ 
void free(void *block): Giải phóng vùng nhớ được quản lý bởi con trỏ block 
Ví dụ 
	 free(pa); 
	free(pb); 
	 => giải phóng vùng nhớ do 
	 2 biến con trỏ pa & pb đang chỉ đến 
14 
Một số phép toán trên con trỏ 
Phép gán = 
Phép so sánh == và != 
Cộng, trừ con trỏ với 1 số nguyên 
Gán NULL cho 1 con trỏ 
15 
Phép gán và phép so sánh 
Ví dụ: Hiện tại ta có:	 int a=10, b=15; 
	int *p, *q; 
	 float *f; 
	p=&a; q=&b; 
	Bây giờ thì phép so sánh:	 (p!=q) => true (1) 
	Thực hiện tiếp lệnh gán: 
	 p=q; 	 
	Bây giờ thì: 
	(p==q) => true (1) 
	Lệnh f=p; => Error, do khác kiểu 
	 Nhưng lệnh f=(float*)p; =>No error 
FFF2 
10 
p 
FFF2 (address) 
a 
FFFA 
15 
q 
FFFA (address) 
b 
FFFA 
10 
p 
FFF2 (address) 
a 
FFFA 
15 
q 
FFFA (address) 
b 
16 
Cộng, trừ con trỏ với 1 số nguyên 
Ta có thể cộng (+), trừ (-) 1 con trỏ với 1 số nguyên N nào đó 
Kết quả trả về là 1 con trỏ. Con trỏ này chỉ đến vùng nhớ cách vùng nhớ của con trỏ hiện tại N phần tử. 
Ví dụ: Cho đoạn chương trình sau: 
	 int *pa; 
	 int *pb, *pc; 
	pa = (int*) malloc(20); /*Cấp phát vùng nhớ 20 byte=10 số nguyên*/ 
	pb = pa + 7; 
	pc = pb - 3; 
Lúc này hình ảnh của pa, pb, pc như sau: 
17 
Gán NULL cho 1 con trỏ 
Ví dụ: 
	 int x=25; 
	 int *ptr; 
	ptr=&x; 
	ptr= NULL ; 
Lệnh gán ptr=NULL => cho con trỏ ptr không trỏ vào (không chứa địa chỉ) vùng nhớ nào cả 
18 
Con trỏ và mảng (1) 
Mảng và con trỏ có mối liên hệ với nhau 
Thay vì truy cập 1 phần tử mảng bằng chỉ số của nó, ta có thể dùng 1 con trỏ 
Để truy cập phần tử thứ i, a[i]: 
	y= *(pa+i); 
Chú ý: pa+1 không phải cộng 1 vào pa. Thay vào đó, địa chỉ là pa+sizeof(*pa) 
19 
Con trỏ và mảng (2) 
1 mảng có thể được xem như một con trỏ. Con trỏ này đang chỉ đến phần tử đầu tiên của mảng. Do đó: 
1 mảng có thể được dùng làm tham số cho 1 hàm 
20 
Con trỏ và mảng (3) 
x sẽ có giá trị của a[i] nào, tại mỗi lệnh gán sau? 
21 
Con trỏ và tham số hình thức của hàm (1) 
Ví dụ 1: Viết 1 hàm để tăng giá trị của biến lên 1 
22 
Con trỏ và tham số hình thức của hàm (2) 
Đâu là sự khác nhau giữa tham số a và b? 
23 
Con trỏ và tham số hình thức của hàm (3) 
Ví dụ 2: Viết hàm hoán đổi nội dung 2 biến 
24 
Con trỏ và tham số hình thức của hàm (4) 
Ví dụ 3: Viết lại hàm hoán vị như sau: 
25 
Con trỏ và tham số hình thức của hàm (5) 
Tại sao hàm trên có thể hoán vị được? 
26 
Hết chương 
Hết chương 
27 

File đính kèm:

  • pptbai_giang_lap_trinh_can_ban_phan_1_chuong_7_kieu_con_tro.ppt