Bài giảng Nhập môn lập trình: Con trỏ, chuỗi - Trần Phước Tuấn
Con trỏ – Pointer
Khai báo
Các toán tử “&”, “*”, “=”, “+”
Nhắc lại về truyền tham số địa chỉ
Con trỏ và mảng
Cấp phát vùng nhớ động
Bạn đang xem tài liệu "Bài giảng Nhập môn lập trình: Con trỏ, chuỗi - Trần Phước Tuấn", để 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 Nhập môn lập trình: Con trỏ, chuỗi - Trần Phước Tuấn
NMLT CON TR?, CHU?I Tr?n Ph??c Tu?n tranphuoctuan.khoatoan.dhsp@gmail.com NH?P MÔN L?P TRÌNH 212/23/2009 Con tr? – Pointer ? Khai báo ? Các toán t? “&”, “*”, “=”, “+” ? Nh?c l?i v? truy?n tham s? ??a ch? ? Con tr? và m?ng ? C?p phát vùng nh? ??ng NH?P MÔN L?P TRÌNH 312/23/2009 Con tr? – M?t s? lý do nên s? d?ng ? Con tr? là ki?u d? li?u l?u tr? ??a ch? c?a các vùng d? li?u trong b? nh? máy tính ? Ki?u con tr? cho phép: ? Truy?n tham s? ki?u ??a ch? ? Bi?u di?n các ki?u, c?u trúc d? li?u ??ng ? ??u tr? d? li?u trong vùng nh? heap ? Con tr? ?ã ???c s? d?ng trong hàm scanf NH?P MÔN L?P TRÌNH 412/23/2009 Con tr? – Khai báo trong C Ki?u con tr? ph?i ???c ??nh ngh?a trên m?t ki?u c? s? ?ã ???c ??nh ngh?a tr??c ?ó. typedef ki?uc?s? *Tênki?u; typedef int *PINT; //PINT là ki?u con tr? - ??a ch? vùng nh? ki?u int int x; PINT p; //p, p1: bi?n ki?u int * int *p1; NH?P MÔN L?P TRÌNH 512/23/2009 int *pi; long int *p; float* pf; char c, d, *pc; /* c và d ki?u char pc là con tr? ??n char */ double* pd, e, f; /* pd là con tr? ??n double e and f are double */ char *start, *end; int *pi; long int *p; float* pf; char c, d, *pc; /* c và d ki?u char pc là con tr? ??n char */ double* pd, e, f; /* pd là con tr? ??n double e and f are double */ char *start, *end; Con tr? – Khai báo trong C NH?P MÔN L?P TRÌNH 612/23/2009 0x91A2 0x1132 Con tr? - Toán t? “&” ? “&”: toán t? l?y ??a ch? c?a 1 bi?n ? ??a ch? c?a t?t c? các bi?n trong ch??ng trình ??u ?ã ???c ch? ??nh t? khi khai báo char g = 'z'; int main() { char c = 'a'; char *p; p = &c; p = &g; return 0; } char g = 'z'; int main() { char c = 'a'; char *p; p = &c; p = &g; return 0; } p c 'a' 0x1132 p g 'z' 0x91A2 NH?P MÔN L?P TRÌNH 712/23/2009 ? “*”: toán t? truy xu?t giá tr? c?a vùng nh? ???c qu?n lý b?i con tr?. #include char g = 'z'; int main() { char c = 'a'; char *p; p = &c; printf("%c\n", *p); p = &g; printf("%c\n", *p); return 0; } #include char g = 'z'; int main() { char c = 'a'; char *p; p = &c; printf("%c\n", *p); p = &g; printf("%c\n", *p); return 0; } a z a z xu?t giá tr? do p ?ang qu?n lý Con tr? - Toán t? “*” 0x91A2 0x1132 p c 'a' 0x1132 p g 'z' 0x91A2 NH?P MÔN L?P TRÌNH 812/23/2009 Con tr? - Truy?n tham s? ??a ch? #include void change(int *v); int main() { int var = 5; change(&var); printf("main: var = %i\n", var); return 0; } void change(int *v) { (*v) *= 100; printf("change: *v = %i\n", (*v)); } #include void change(int *v); int main() { int var = 5; change(&var); printf("main: var = %i\n", var); return 0; } void change(int *v) { (*v) *= 100; printf("change: *v = %i\n", (*v)); } NH?P MÔN L?P TRÌNH 912/23/2009 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 int main() { int i = 13; short *p = NULL; if (p == NULL) printf(“Con tr? không h?p l?!\n"); else printf(“Giá tr? : %hi\n", *p); return 0; } #include int main() { int i = 13; short *p = NULL; if (p == NULL) printf(“Con tr? không h?p l?!\n"); else printf(“Giá tr? : %hi\n", *p); return 0; } NH?P MÔN L?P TRÌNH 1012/23/2009 0x15A0 0x15A4 0x15A0 Con tr? - Toán t? gán “=” ? Có s? khác bi?t r?t quan tr?ng khi th?c hi?n các phép gán: int i = 10, j = 14; int* p = &i; int *q = &j; *p = *q; int i = 10, j = 14; int* p = &i; int *q = &j; *p = *q; int i = 10, j = 14; int *p = &i; int *q = &j; p = q; int i = 10, j = 14; int *p = &i; int *q = &j; p = q; và: p i 10 0x15A0 14 q j 0x15A4 14 p i 10 0x15A0 q j 0x15A4 0x15A4 14 0x15A4 NH?P MÔN L?P TRÌNH 1112/23/2009 Luy?n t?p – ?i?n vào ô tr?ng int main(void) { int i = 10, j = 14, k; int *p = &i; int *q = &j; *p += 1; p = &k; *p = *q; p = q; *p = *q; return 0; } int main(void) { int i = 10, j = 14, k; int *p = &i; int *q = &j; *p += 1; p = &k; *p = *q; p = q; *p = *q; return 0; } i 0x2100 j 0x2104 k 0x1208 p 0x120B q 0x1210 NH?P MÔN L?P TRÌNH 1212/23/2009 Con tr? và 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 trong su?t chu k? s?ng. ? 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 int main() { int a[10] = {1, 3, 4, 2, 0}; int *p; p = a; //a = p: sai printf(“0x%04X %i 0x%04X %i\n“, ); a, a[0], p, *p); return 0; } #include int main() { int a[10] = {1, 3, 4, 2, 0}; int *p; p = a; //a = p: sai printf(“0x%04X %i 0x%04X %i\n“, ); a, a[0], p, *p); return 0; } NH?P MÔN L?P TRÌNH 1312/23/2009 34 0x15A02 Con tr? - Toán t? “+” v?i s? nguyên #include int main() { short a[10] = {1, 3, 5, 2, 0}; short *p = a; printf(“0x%04X %i 0x%04X %i\n“, ); a, a[0], p, *p); p ++; printf(“0x%04X %i 0x%04X %i\n“, ); a, a[0], p, *p); (*p) ++; printf(“0x%04X %i 0x%04X %i\n“, ); a, a[0], p, *p); return 0; } #include int main() { short a[10] = {1, 3, 5, 2, 0}; short *p = a; printf(“0x%04X %i 0x%04X %i\n“, ); a, a[0], p, *p); p ++; printf(“0x%04X %i 0x%04X %i\n“, ); a, a[0], p, *p); (*p) ++; printf(“0x%04X %i 0x%04X %i\n“, ); a, a[0], p, *p); return 0; } 1 5 2 0 a 0x15A0 p 0x16B2 NH?P MÔN L?P TRÌNH 1412/23/2009 Con tr? - Luy?n t?p #include int main() { int a[10] = {2, 3, 5, 1, 4, 7, 0}; int *p = a; printf(“%i %i\n“, a[0], *p); p ++; printf(“%i %i\n“, *p, p[2]); p ++; a[2] = 9; printf(“%i %i\n“, p[1], *p); p -= 2; printf(“%i %i\n”, p[3], p[1]); return 0; } #include int main() { int a[10] = {2, 3, 5, 1, 4, 7, 0}; int *p = a; printf(“%i %i\n“, a[0], *p); p ++; printf(“%i %i\n“, *p, p[2]); p ++; a[2] = 9; printf(“%i %i\n“, p[1], *p); p -= 2; printf(“%i %i\n”, p[3], p[1]); return 0; } 2 2 3 1 1 9 1 3 2 2 3 1 1 9 1 3 NH?P MÔN L?P TRÌNH 1512/23/2009 Con tr? - C?p phát vùng nh? ??ng #include int main() { int *p = new int[10]; p[0] = 1; p[3] = -7; delete []p; return 0; } #include int main() { int *p = new int[10]; p[0] = 1; p[3] = -7; delete []p; return 0; } ? Có th? ch? ??nh vùng m?i cho 1 con tr? qu?n lý b?ng các l?nh hàm malloc, calloc ho?c toán t? new c?a C++ ? Vùng nh? do l?p trình viên ch? ??nh ph?i ???c gi?i phóng b?ng l?nh free (malloc, calloc) ho?c toán t? delete (new) NH?P MÔN L?P TRÌNH 1612/23/2009 Tóm l??c ? Khai báo ? Các toán t? “&”, “*”, “=”, “+” ? Nh?c l?i v? truy?n tham s? ??a ch? ? Con tr? và m?ng ? C?p phát vùng nh? ??ng Chu?i ký t? - String NH?P MÔN L?P TRÌNH 1812/23/2009 Chu?i ký t? – Strings ? M?t s? qui t?c ? Nh?p / xu?t ? Con tr? và chu?i ký t? ? M?t s? hàm th? vi?n NH?P MÔN L?P TRÌNH 1912/23/2009 Chu?i ký t? - M?t s? qui t?c ? Chu?i ký t? là m?ng m?t chi?u có m?i thành ph?n là m?t s? nguyên ???c k?t thúc b?i s? 0. ? Ký t? k?t thúc (0) ? cu?i chu?i ký t? th??ng ???c g?i là ký t? null (không gi?ng con tr? NULL). Có th? ghi là 0 ho?c ‘\0’ (không ph?i ch? o). ? ???c khai báo và truy?n tham s? nh? m?ng m?t chi?u. char s[100]; unsigned char s1[1000]; char s[100]; unsigned char s1[1000]; NH?P MÔN L?P TRÌNH 2012/23/2009 char first_name[5] = { 'J', 'o', 'h', 'n', '\0' }; char last_name[6] = "Minor"; char other[] = "Tony Blurt"; char characters[7] = "No null"; char first_name[5] = { 'J', 'o', 'h', 'n', '\0' }; char last_name[6] = "Minor"; char other[] = "Tony Blurt"; char characters[7] = "No null"; first_name last_name other characters Chu?i ký t? - Ví d? 0'n''h''o''J' 0'r''o''n''i''M' 32 'B' 'l' 'u' 'r' 0't''y'‘n’'o''T' 'l' 'l' 0'u''n'32'o''N' NH?P MÔN L?P TRÌNH 2112/23/2009 ? Có th? nh?p / xu?t chu?i ký t? s b?ng cách nh?p t?ng ký t? c?a s ? Ho?c s? d?ng các hàm scanf và printf v?i ký t? ??nh d?ng “%s” ? Nh?p chu?i có kho?ng tr?ng dùng hàm gets char name[100]; printf("Nhap mot chuoi ky tu %s: "); gets(name); char name[100]; printf("Nhap mot chuoi ky tu %s: "); gets(name); Chu?i ký t? - Nh?p / xu?t char other[] = "Tony Blurt"; printf("%s\n", other); char other[] = "Tony Blurt"; printf("%s\n", other); NH?P MÔN L?P TRÌNH 2212/23/2009 ??u ý: k?t thúc chu?i #include int main() { char other[] = "Tony Blurt"; printf("%s\n", other); other[4] = '\0'; printf("%s\n", other); return 0; } #include int main() { char other[] = "Tony Blurt"; printf("%s\n", other); other[4] = '\0'; printf("%s\n", other); return 0; } Tony Blurt Tony Tony Blurt Tony other "Blurt" s? không ???c in ra 32 'B' 'l' 'u' 'r' 0't''y'‘n’'o''T' NH?P MÔN L?P TRÌNH 2312/23/2009 Chu?i ký t? – M?t s? hàm th? vi?n ? L?y ?? dài chu?i l = strlen(s); ? ??i toàn b? các ký t? c?a chu?i thành IN HOA strupr(s); ? ??i toàn b? các ký t? c?a chu?i thành in th??ng strlwr(s); NH?P MÔN L?P TRÌNH 2412/23/2009 Chu?i ký t? – M?t s? hàm th? vi?n ? So sánh chu?i: so sánh theo th? t? t? ?i?n Phân bi?t IN HOA – in th??ng: int strcmp(const char *s1, const char *s2); Không phân bi?t IN HOA – in th??ng: int stricmp(const char *s1, const char *s2); NH?P MÔN L?P TRÌNH 2512/23/2009 #include int main() { char s1[] = "Minor"; char s2[] = "Tony"; int cmp = strcmp(s1, s2); if (cmp < 0) printf("%s < %s", s1, s2); else if (cmp == 0) printf("%s = %s", s1, s2); else printf("%s > %s", s1, s2); return 0; } #include int main() { char s1[] = "Minor"; char s2[] = "Tony"; int cmp = strcmp(s1, s2); if (cmp < 0) printf("%s < %s", s1, s2); else if (cmp == 0) printf("%s = %s", s1, s2); else printf("%s > %s", s1, s2); return 0; } Chu?i ký t? – ví d? strcmp Minor < TonyMinor < Tony NH?P MÔN L?P TRÌNH 2612/23/2009 Chu?i ký t? – M?t s? hàm th? vi?n ? Gán n?i dung chu?i: o Chép toàn b? chu?i source sang chu?i dest: int strcpy(char *dest, const char *src); o Chép t?i ?a n ký t? t? source sang dest: int strncpy(char *dest, const char *src, int n); ? T?o chu?i m?i t? chu?i ?ã có: char *strdup(const char *src); NH?P MÔN L?P TRÌNH 2712/23/2009 #include int main() { char s[] = "Tony Blurt"; char s2[100], *s3; strcpy(s2, s); printf("%s\n", s2); strncpy(s2 + 2, "12345", 3); printf("%s\n", s2); s3 = strdup(s + 5); printf("%s\n", s3); free(s3); return 0; } #include int main() { char s[] = "Tony Blurt"; char s2[100], *s3; strcpy(s2, s); printf("%s\n", s2); strncpy(s2 + 2, "12345", 3); printf("%s\n", s2); s3 = strdup(s + 5); printf("%s\n", s3); free(s3); return 0; } Chu?i ký t? – ví d? strcpy Tony Blurt To123Blurt Blurt Tony Blurt To123Blurt Blurt NH?P MÔN L?P TRÌNH 2812/23/2009 Chu?i ký t? – M?t s? hàm th? vi?n ? N?i chu?i: char *strcat(char *dest, const char *src); ? Tách chu?i: char *strtok(char *s, const char *sep); Tr? v? ??a ch? c?a ?o?n ??u tiên. Mu?n tách ?o?n k? ti?p tham s? th? nh?t s? là NULL NH?P MÔN L?P TRÌNH 2912/23/2009 #include #define SEPARATOR "., " int main() { char s[]= "Thu strtok: 9,123.45"; char *p; p = strtok(s, SEPARATOR); while (p != NULL) { printf("%s\n", p); p = strtok(NULL, SEPARATOR); } return 0; } #include #define SEPARATOR "., " int main() { char s[]= "Thu strtok: 9,123.45"; char *p; p = strtok(s, SEPARATOR); while (p != NULL) { printf("%s\n", p); p = strtok(NULL, SEPARATOR); } return 0; } Chu?i ký t? – ví d? strtok Thu strtok: 9 123 45 Thu strtok: 9 123 45 NH?P MÔN L?P TRÌNH 3012/23/2009 Chu?i ký t? – M?t s? hàm th? vi?n ? Tìm m?t ký t? trên chu?i: char *strchr(const char *s, int c); ? Tìm m?t ?o?n ký t? trên chu?i: char *strstr(const char *s1, const char *s2); NH?P MÔN L?P TRÌNH 3112/23/2009 #include int main() { char s[]= "Thu tim kiem chuoi"; char *p; p = strchr(s, 'm'); printf("%s\n", p); p = strstr(s, "em"); printf("%s\n", p); return 0; } #include int main() { char s[]= "Thu tim kiem chuoi"; char *p; p = strchr(s, 'm'); printf("%s\n", p); p = strstr(s, "em"); printf("%s\n", p); return 0; } Chu?i ký t? – ví d? tìm ki?m m kiem chuoi em chuoi m kiem chuoi em chuoi NH?P MÔN L?P TRÌNH 3212/23/2009 #include void StrIns(char *s, char *sub) { int len = strlen(sub); memmove(s + len, s, strlen(s)+1); strncpy(s, sub, len); } int main() { char s[]= "Thu chen"; StrIns(s, "123"); printf("%s\n", s); StrIns(s + 8, "45"); printf("%s\n", p); return 0; } #include void StrIns(char *s, char *sub) { int len = strlen(sub); memmove(s + len, s, strlen(s)+1); strncpy(s, sub, len); } int main() { char s[]= "Thu chen"; StrIns(s, "123"); printf("%s\n", s); StrIns(s + 8, "45"); printf("%s\n", p); return 0; } Chu?i ký t? – chèn m?t ?o?n ký t? 123 Thu chen 123 Thu 45chen 123 Thu chen 123 Thu 45chen NH?P MÔN L?P TRÌNH 3312/23/2009 #include void StrDel(char *s, int n) { memmove(s, s + n, strlen(s+n)+1); } int main() { char s[]= "Thu xoa 12345"; StrDel(s, 4); printf("%s\n", s); StrDel(s + 4, 3); printf("%s\n", p); return 0; } #include void StrDel(char *s, int n) { memmove(s, s + n, strlen(s+n)+1); } int main() { char s[]= "Thu xoa 12345"; StrDel(s, 4); printf("%s\n", s); StrDel(s + 4, 3); printf("%s\n", p); return 0; } Chu?i ký t? – xóa m?t ?o?n ký t? xoa 12345 xoa 45 xoa 12345 xoa 45 NH?P MÔN L?P TRÌNH 3412/23/2009 Tóm l??c ? Khai báo ? Nh?p / xu?t ? Con tr? và chu?i ký t? ? M?t s? hàm th? vi?n ? Chèn / lo?i b? m?t ?o?n con
File đính kèm:
- bai_giang_nhap_mon_lap_trinh_con_tro_chuoi_tran_phuoc_tuan.pdf