1. Trang chủ
  2. » Giáo án - Bài giảng

Tin học cơ sở 4 Con trỏ

19 308 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

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],

Ngày đăng: 03/04/2016, 21:54

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN