Tham khảo tài liệu ''kỹ thuật lập trình c chuyên nghiệp phần 4'', công nghệ thông tin, kỹ thuật lập trình phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả
C ttrỏ Con ỏ – Pointer P i t Khai báo Cá toán Các t tử “&”, ” “*”, ” “=”, “ ” “+” Nhắc lại truyền tham số địa Con trỏ mảng Cấ phát Cấp hát vùng ù nhớ hớ động độ C ttrỏ Con ỏ – Một Mộ sốố lý d nên ê sử dụng d Con trỏ kiểu liệu lưu trữ địa vùng liệu nhớ máy tính Kiểu ể trỏ cho phép phép:: Truyền tham số kiểu địa Biểu ể diễn ễ kiểu, ể cấu ấ trúc liệu động Lưu trữ liệu vùng nhớ heap Con trỏ sử dụng hàm scanf C ttrỏ Con ỏ – Khai Kh i báo bá C Kiể trỏ Kiểu t ỏ phải hải đ đị h nghĩa định hĩ t ê ột kiểu kiể sở định nghĩa trước đó typedef kiểucơsở *Tênkiểu Tênkiểu; ; typedef int *PINT; //PINT // PINT kiểu trỏ - địa vùng nhớ kiểu int int PINT int x; p; //p, // p1: biế biến kiểu kiể int i t * *p1; C ttrỏ Con ỏ – Khai Kh i báo bá t C int *pi; long int *p; float* pf; char c, d, *pc; /* c d kiểu char pc trỏ đến char */ double* pd, e, f; char *start, *end; /* pd trỏ đến double e and f are double */ C ttrỏ Con ỏ - Toán T tử “& “&” “&”: toán tử lấy địa biến Địa tất biến chương trình định từ khai báo char g = 'z'; int { main() char c = 'a'; char *p; p = &c; p = &g; return 0; } p 0x1132 p 0x91A2 c 0x1132 'a' g 0x91A2 'z' C ttrỏ Con ỏ - Toán T tử “*” “*”: toán tử truy xuất giá trị vùng nhớ quản lý trỏ trỏ #include char g = 'z'; int main() () a { z char c = 'a'; char *p; p; p = &c; printf("%c\n", *p); p = &g; printf("%c\n", *p); return 0; } p 0x1132 p 91A2 0x91A2 c 0x1132 'a' g 0x91A2 xuất giá trị p quản lý ' ' 'z' C ttrỏ Con ỏ - Truyền T ề tham h số ố đị địa hỉ #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)); } Con C ttrỏ ỏ NULL Giá trị t ị đặc đặ biệt để hỉ ằ trỏ t ỏ không khô quản ả lý vùng ù Giá trị thường dùng để trỏ không hợp lệ 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; ; } C ttrỏ Con ỏ - Toán T tử gán “=” “ ” Có khác biệt ất quan trọng t thực th hiệ phép gán: gán : int i = 10, j = 14; int* p = &i; int *q = &j; *p = *q; p 15A0 0x15A0 q 0x15A4 i 10 14 0x15A0 j 14 0x15A4 và: int i = 10, j = 14; int *p p = &i; ; int *q = &j; p = q; p 0x15A4 0x15A0 q 0x15A4 i 0x15A0 j 10 14 0x15A4 L ệ tập Luyện tậ – Điề Điền vào ô trống ố int main(void) { int i = 10, 10 j = 14 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 C Con ttrỏ ỏ vàà Mả Mảng Biế kiểu Biến kiể mảng ả địa đị hỉ tĩnh tĩ h ủ ột vùng ù nhớ, hớ đ xác định khai báo, không thay đổi suốt chu kỳ sống sống Biến trỏ địa động vùng nhớ, nhớ xác định qua phép gán địa chương trình thực thi thi #include int main() { int a[10] = {1 {1, 3, 4, 2, 0}; int *p; p = a; //a = p: sai printf(“0x%04X i tf(“0 %04X %i 0x%04X %04X %i\ %i\n“, “ a, a[0], p, *p); return 0; } C ttrỏ Con ỏ - Toán T tử “+” “ ” với ới sốố nguyên ê #include int main() { short a[10] = {1, 3, 5, 2, 0}; short *p = a; printf(“0x%04X printf( 0x%04X %i 0x%04X %i\n“ %i\n , a, a[0], p, *p); p ++; printf(“0x%04X i tf(“0 %04X %i 0x%04X %04X %i\ %i\n“, “ a, a[0], p, *p); (*p) ++; printf(“0x%04X %i 0x%04X %i\n“, a, a[0], p, *p); return 0; } 0x15A0 a … 0x16B2 p 0x15A0 0x15A2 C ttrỏ Con ỏ - Luyện L ệ tập ậ #include int main() { int a[10] = {2, 3, 5, 1, 4, 7, 0}; int *p = a; printf(“%i printf( %i %i\n“ %i\n , a[0], a[0] *p); p ++; printf(“%i %i\n“, *p, p[2]); p ++; ++ a[2] [2] = 9; printf(“%i %i\n“, p[1], *p); p -= 2; printf(“%i %i\n”, p[3], p[1]); return 0; } 1 C ttrỏ Con ỏ - Cấp Cấ phát há vùng ù nhớ hớ động độ Có thể hỉ định đị h vùng ù ới cho h trỏ t ỏ quản ả lý bằ lệnh hàm malloc malloc,, calloc tốn tử new C++ Vùng nhớ lập trình viên định phải giải phóng lệnh free (malloc, calloc) toán tử delete (new) #include int main() { int *p = new int[10]; p[0] = 1; p[3] = -7; 7; delete []p; return 0; } Cấ phát Cấp hát động độ : malloc() động: malloc ll () vàà calloc() calloc ll () Hà malloc Hàm ll vàà calloc ll cho h phép cấp ấ phát hát vùng ù nhớ hớ lúc chạy chương trình trình void **malloc malloc(( size_t size); void **calloc calloc(( size_t nItems nItems,, size_t size); Hàm calloc ll cấp ấ phát h vùng nhớ h khởi kh i tạo tất ấ bit bi vùng nhớ cấp phát Hàm malloc cấp phát vùng nhớ nhớ Ví d dụ 11: dùng dù malloc() ll () 1 7 10 11 12 #include