Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
444 KB
Nội dung
Tin Học Cơ Sở Con trỏ Nôị Dung • • • • • Khai báo Các toán tử &, *, =, + Nhắc lại truyền tham số địa Con trỏ & mảng Cấp phát vùng nhớ động Lê Nguyên Khôi Giới thiệu Con Trỏ • Định nghĩa Con trỏ: – Kiểu liệu lư u trữ địa vùng liệu nhớ máy tính – Chứ a đị a biến mang giá trị cụ thể • Mục đích Con trỏ: – Truyền tham số kiểu địa – Biểu diễn kiểu & cấu trúc liệu động – Liên quan chặt chẽ đến mảng & xâu • Con trỏ đượ c sử dụng hàm scanf Lê Nguyên Khôi Biến Con Trỏ • Con trỏ kiểu liệu – Kiểu trỏ phải đượ c đị nh nghĩa kiểu sở đượ c đị nh nghĩa trướ c typedef kiểucơsở *Tênkiểu; typedef int * IntPointer; // IntPointer kiểu trỏ - địa vùng nhớ kiểu int – Có thể dùng biến để lư u trữ trỏ – Không phải kiểu int, double,… •Là trỏ đến biến kiểu liệu int, double,… Lê Nguyên Khôi Biến Con Trỏ - Ví dụ int x; int *p; IntPointer p1; – p p1 đượ c khai báo trỏ đến kiểu int – p p1 biến kiểu int* – p p1 dùng để lưu địa biến kiểu int –Có thể sử dụng p p1 để lư u địa x Lê Nguyên Khôi Khai báo biến Con Trỏ • Khai báo biến trỏ giống biến kiểu liệu khác: – Thêm toán tử * vào trướ c biến – Tạo trỏ đến kiểu liệu khai báo • Toán tử * bắt buộc phải trướ c biến • int *p1, *p2, v1, v2; – p1, p2 trỏ đến biến kiểu int – v1, v2 biến kiểu int Lê Nguyên Khôi Khai báo Con Trỏ C int int *pi; *pi; long long int int *p; *p; float float char char *pf; *pf; c, c, d, d, *pc; *pc; /* /* cc và dd kiểu kiểu char char pc pc là con trỏ trỏ đến đến char char */ */ double double *pd, *pd, e, e, f; f; char char /* /* pd pd là ee and and con trỏ trỏ đến đến double double ff are are double double */ */ *start, *start, *end; *end; Lê Nguyên Khôi Toán tử & • &: toán tử lấy (trả về) địa biến • Địa tất biến chương trình đượ c định từ khai báo char char gg == 'z'; 'z'; int int main() main() {{ char char cc == 'a'; 'a'; char char *p; *p; pp == &c; &c; pp == &g; &g; return return 0; 0; }} Lê Nguyên Khôi p 0x1132 p 0x91A2 c 0x1132 'a' g 0x91A2 'z' Toán tử * • *: toán tử truy xuất giá trị vùng nhớ quản lý bở i trỏ #include #include char char gg == 'z'; 'z'; int int main() main() {{ char char cc == 'a'; 'a'; char char *p; *p; pp == &c; &c; printf("%c\n", printf("%c\n", pp == &g; &g; printf("%c\n", printf("%c\n", return return 0; 0; }} Lê Nguyên Khôi aa zz *p); *p); *p); *p); p 0x1132 p 0x91A2 c 0x1132 'a' g 0x91A2 'z' xuất giá trị vùng nhớ p quản lý Truyền tham số đị a #include #include void void ThayDoiTruyenDiaChi(int ThayDoiTruyenDiaChi(int *v); *v); int intmain() main() {{ int int var var == 5; 5; ThayDoiTruyenDiaChi(&var); ThayDoiTruyenDiaChi(&var); printf("main: printf("main: var var == %i\n", %i\n", var); var); return 0; return 0; }} void void ThayDoiTruyenDiaChi(int ThayDoiTruyenDiaChi(int *v) *v) {{ (*v) (*v) *= *= 100; 100; printf(“ham: printf(“ham: *v *v == %i\n", %i\n", (*v)); (*v)); }} Lê Nguyên Khôi 10 Truyền tham số giá trị #include #include void void ThayDoiTruyenGiaTri(int ThayDoiTruyenGiaTri(int v); v); int intmain() main() {{ int int var var == 5; 5; ThayDoiTruyenGiaTri(var); ThayDoiTruyenGiaTri(var); printf("main: printf("main: var var == %i\n", %i\n", var); var); return 0; return 0; }} void void ThayDoiTruyenGiaTri(int ThayDoiTruyenGiaTri(int v) v) {{ vv *= *= 100; 100; printf(“ham: printf(“ham: vv == %i\n", %i\n", v); v); }} Lê Nguyên Khôi 11 Con Trỏ NULL • Giá trị đặc biệt để trỏ không quản lý vùng Giá trị thườ ng dùng để trỏ không hợ p lệ #include #include int int main() main() {{ int int ii == 13; 13; short short *p *p == NULL; NULL; if if (p (p == == NULL) NULL) printf(“Con printf(“Con trỏ trỏ else else printf(“Giá printf(“Giá trị trị return return 0; 0; Lê Nguyên Khôi }} không không hợp hợp lệ!\n"); lệ!\n"); :: %hi\n", %hi\n", *p); *p); 12 Toán tử gán = • Có thể gán giá trị cho biến trỏ int *p, *q; p = q; –Gán giá trị trỏ cho trỏ khác –Cho p tớ i vùng nhớ mà q • Không đượ c nhầm lẫn vớ i: *p = *q; –Gán giá trị mà q đến cho biến (vùng nhớ ) mà p đến Lê Nguyên Khôi 13 Toán tử gán = - Ví dụ • Có khác biệt quan trọng thực phép gán: int int int int int int ii == 10, 10, jj == 14; 14; *p *p == &i; &i; *q *q == &j; &j; *p *p == *q; *q; p 0x15A0 q 0x15A4 i 10 14 0x15A0 j 14 0x15A4 int int int int int int ii == 10, 10, jj == 14; 14; *p *p == &i; &i; *q *q == &j; &j; pp == q; q; Khôi Lê Nguyên p 0x15A4 0x15A0 q 0x15A4 i 0x15A0 j 10 14 0x15A4 14 Luyện tập – Điền vào ô trống int int main(void) main(void) {{ int int ii == 10, 10, jj == 14, 14, k; k; int int *p *p == &i; &i; int int *q *q == &j; &j; *p *p += += 1; 1; pp == &k; &k; *p *p == *q; *q; pp == q; q; *p *p == i; i; }} return return 0; 0; Lê Nguyên Khôi i 0x2100 11 10 j 0x2104 14 k 0x1208 14 ? p 0x120B 0x2100 0x2108 q 0x1210 0x2104 15 Con Trỏ & Mảng • Biến kiểu mảng địa tĩnh vùng nhớ, xác định khai báo, không thay đổi thay đổi • Biến trỏ địa động vùng nhớ, xác định qua phép gán địa chươ ng trình thực thi #include #include int int main() main() {{ int int a[10] a[10] == {1, {1, 3, 3, 4, 4, 2, 2, int int *p; *p; pp == a; a; //a //a == p: p: sai sai printf(“0x%04X printf(“0x%04X %i %i 0x%04X 0x%04X a, a, a[0], a[0], p, p, *p); *p); return return 0; 0; Lê}} Nguyên Khôi 0}; 0}; %i\n“, %i\n“, 16 Toán tử + với số nguyên #include #include int intmain() main() {{ short short a[10] a[10] == {1, {1, 3, 3, 5, 5, 2, 2, 0}; 0}; short short *p *p == a; a; printf(“0x%04X printf(“0x%04X %i %i 0x%04X 0x%04X %i\n“, %i\n“, a, a, a[0], a[0], p, p, *p); *p); pp ++; ++; printf(“0x%04X printf(“0x%04X %i %i 0x%04X 0x%04X %i\n“, %i\n“, a, a, a[0], a[0], p, p, *p); *p); (*p) (*p) ++; ++; printf(“0x%04X printf(“0x%04X %i %i 0x%04X 0x%04X %i\n“, %i\n“, a, a, a[0], a[0], p, p, *p); *p); return return 0; 0; Lê Nguyên Khôi }} 0x15A0 a … 0x16B2 p 0x15A2 17 Con Trỏ - Luyện tập #include #include int intmain() main() {{ int int a[10] a[10] == {2, {2, 3, 3, 5, 5, 1, 1, 4, 4, 7, 7, 0}; 0}; int int *p *p == a; a; printf(“%i printf(“%i %i\n“, %i\n“, a[0], a[0], *p); *p); pp ++; ++; printf(“%i printf(“%i %i\n“, %i\n“, *p, *p, p[2]); p[2]); pp ++; ++; a[2] a[2] == 9; 9; printf(“%i printf(“%i %i\n“, %i\n“, p[1], p[1], *p); *p); pp -= -= 2; 2; printf(“%i printf(“%i %i\n”, %i\n”, p[3], p[3], p[1]); p[1]); return return 0; 0; }} Lê Nguyên Khôi 22 22 33 11 11 99 11 33 18 Cấp phát vùng nhớ độ ng • Có thể định vùng mớ i cho trỏ quản lý lệnh hàm malloc • Vùng nhớ lập trình viên định phải đượ c giải phóng lệnh free #include #include #include #include int int main() main() {{ int int *p *p == (int*) (int*) malloc malloc (sizeof(int) (sizeof(int) ** 10); 10); p[0] p[0] == 1; 1; p[3] p[3] == -7; -7; free(p); free(p); return return 0; 0; }} Lê Nguyên Khôi 19 [...]... printf(“0x%04X %i %i 0x%04X 0x%04X %i\n“, %i\n“, a, a, a[0], a[0], p, p, *p); *p); pp ++; ++; printf(“0x%04X printf(“0x%04X %i %i 0x%04X 0x%04X %i\n“, %i\n“, a, a, a[0], a[0], p, p, *p); *p); (*p) (*p) ++; ++; printf(“0x%04X printf(“0x%04X %i %i 0x%04X 0x%04X %i\n“, %i\n“, a, a, a[0], a[0], p, p, *p); *p); return return 0; 0; Lê Nguyên Khôi }} 0x15A0 a 1 4 3 5 2 0 … 0x16B2 p 0x15A2 17 Con Trỏ - Luyện... &i; *q *q == &j; &j; *p *p == *q; *q; p 0x15A0 q 0x15A4 i 10 14 0x15A0 j 14 0x15A4 và int int int int int int ii == 10, 10, jj == 14; 14; *p *p == &i; &i; *q *q == &j; &j; pp == q; q; Khôi Lê Nguyên p 0x15A4 0x15A0 q 0x15A4 i 0x15A0 j 10 14 0x15A4 14 Luyện tập – Điền vào ô trống int int main(void) main(void) {{ int int ii == 10, 10, jj == 14, 14, k; k; int int *p *p == &i; &i; int int *q *q == &j;... %i\n", %i\n", v); v); }} Lê Nguyên Khôi 11 Con Trỏ NULL • Giá trị đặc biệt để chỉ rằng con trỏ không quản lý vùng nào Giá trị này thườ ng được dùng để chỉ một con trỏ không hợ p lệ #include #include int int main() main() {{ int int ii == 13; 13; short short *p *p == NULL; NULL; if if (p (p == == NULL) NULL) printf( Con printf( Con trỏ trỏ else else printf(“Giá printf(“Giá trị trị... 0x21 04 14 k 0x1208 14 ? p 0x120B 0x2100 0x2108 q 0x1210 0x21 04 15 Con Trỏ & Mảng • Biến kiểu mảng là địa chỉ tĩnh của một vùng nhớ, được xác định khi khai báo, không thay đổi bao giờ thay đổi • Biến con trỏ là địa chỉ động của một vùng nhớ, được xác định qua phép gán địa chỉ khi chươ ng trình thực thi #include #include int int main() main() {{ int int a[10] a[10] == {1, {1, 3, 3, 4, ... gán giá trị cho biến con trỏ int *p, *q; p = q; –Gán giá trị con trỏ cho con trỏ khác –Cho p chỉ tớ i vùng nhớ mà q đang chỉ • Không đượ c nhầm lẫn vớ i: *p = *q; –Gán giá trị mà q đang chỉ đến cho biến (vùng nhớ ) mà p đang chỉ đến Lê Nguyên Khôi 13 Toán tử gán = - Ví dụ • Có sự khác biệt rất quan trọng khi thực hiện các phép gán: int int int int int int ii == 10, 10, jj == 14; 14; *p *p == &i; &i;... 4, 4, 2, 2, int int *p; *p; pp == a; a; //a //a == p: p: sai sai printf(“0x%04X printf(“0x%04X %i %i 0x%04X 0x%04X a, a, a[0], a[0], p, p, *p); *p); return return 0; 0; Lê}} Nguyên Khôi 0}; 0}; %i\n“, %i\n“, 16 Toán tử + với số nguyên #include #include int intmain() main() {{ short short a[10] a[10] == {1, {1, 3, 3, 5, 5, 2, 2, 0}; 0}; short short *p *p == a; a; printf(“0x%04X printf(“0x%04X... return 0; 0; Lê Nguyên Khôi }} 0x15A0 a 1 4 3 5 2 0 … 0x16B2 p 0x15A2 17 Con Trỏ - Luyện tập #include #include int intmain() main() {{ int int a[10] a[10] == {2, {2, 3, 3, 5, 5, 1, 1, 4, 4, 7, 7, 0}; 0}; int int *p *p == a; a; printf(“%i printf(“%i %i\n“, %i\n“, a[0], a[0], *p); *p); pp ++; ++; printf(“%i printf(“%i %i\n“, %i\n“, *p, *p, p[2]); p[2]); pp ++; ++; a[2] a[2] == 9; 9; printf(“%i... pp -= -= 2; 2; printf(“%i printf(“%i %i\n”, %i\n”, p[3], p[3], p[1]); p[1]); return return 0; 0; }} Lê Nguyên Khôi 22 22 33 11 11 99 11 33 18 Cấp phát vùng nhớ độ ng • Có thể chỉ định vùng mớ i cho 1 con trỏ quản lý bằng các lệnh hàm malloc • Vùng nhớ do lập trình viên chỉ định phải đượ c giải phóng bằng lệnh free #include #include #include #include int int main() ... Mục đích Con trỏ: – Truyền tham số kiểu địa – Biểu diễn kiểu & cấu trúc liệu động – Liên quan chặt chẽ đến mảng & xâu • Con trỏ đượ c sử dụng hàm scanf Lê Nguyên Khôi Biến Con Trỏ • Con trỏ kiểu... ii == 10, 10, jj == 14; 14; *p *p == &i; &i; *q *q == &j; &j; *p *p == *q; *q; p 0x15A0 q 0x15A4 i 10 14 0x15A0 j 14 0x15A4 int int int int int int ii == 10, 10, jj == 14; 14; *p *p == &i; &i;... *p == a; a; printf(“0x%04X printf(“0x%04X %i %i 0x%04X 0x%04X %i
“, %i
“, a, a, a[0], a[0], p, p, *p); *p); pp ++; ++; printf(“0x%04X printf(“0x%04X %i %i 0x%04X 0x%04X %i
“, %i
“, a, a, a[0],