.c om ng co an th ng du o u cu Company LOGO CuuDuongThanCong.com https://fb.com/tailieudientucntt Các nội dung: c om ng co an th ng du o u Khái niệm Thao tác POINTER POINTER mảng Đối số hàm pointer - truyền đối số theo số dạng tham số biến Hàm trả pointer mảng Chuỗi ký tự Pointer việc định vị nhớ động Mảng pointer cu CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt ng u du o ng th an co Pointer pointer Đối số hàm MAIN Pointer trỏ đến hàm Ứng dụng cu c om Các nội dung: CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM cu u du o ng th an co ng c om Một biến có kiểu pointer lưu liệu nó, địa đối tượng khảo sát Đối tượng biến, chuỗi hàm CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt KHÁI NIỆM c om Ví dụ 13.1: Chương trình đổi trị cu u du o ng th an co ng #include void Swap (int doi_1, int doi_2); main() { int a = 3, b = 4; printf (“Trước gọi hàm, a = %d, b = %d.\n”,a,b); Swap (a, b); // Gọi hàm đổi trị printf (“Sau gọi hàm, a = %d, b = %d.\n”,a,b);} void Swap (int doi_1, int doi_2) { int temp = doi_1; doi_1 = doi_2 ; doi_2 = temp ; } CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt cu u du o Hình ảnh stack thực thi điều khiển chương trình dòng doi_1 = doi_2 ; ng th an co ng c om KHÁI NIỆM CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt du o ng th an co ng c om KHÁI NIỆM cu u Hình ảnh stack thực thi điều khiển đến cuối chương trình CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt THAO TÁC TRÊN POINTER co ng c om Cú pháp để khai báo biến pointer: kiểu *tên_biến_pointer Với: an kiểu kiểu bất kỳ, xác định kiểu liệu ghi vào đối tượng mà trỏ trỏ đến tên_biến_pointer tên biến trỏ, danh hiệu hợp lệ u cu du o ng th CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt THAO TÁC TRÊN POINTER cu u du o ng th an co ng c om Biến đối tượng mà trỏ trỏ đến truy xuất qua tên biến trỏ dấu "*" trước biến trỏ, cú pháp cụ thể sau: * tên_biến_con_trỏ CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt THAO TÁC TRÊN POINTER cu u du o ng th an co ng c om Khai báo biến pointer - pointer hằng: Trong ngôn ngữ C, toán tử lấy địa biến làm việc, toán tử dấu & (ampersand), tạm gọi toán tử lấy địa Cú pháp sau: & biến với biến biến thuộc kiểu bất kỳ, không biến ghi CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 10 MẢNG CÁC POINTER an co ng c om Một mảng pointer khởi động trị mảng mảng toàn cục hay mảng tĩnh Ví dụ: cu u du o ng th static char *thu[7] = {"Thu 2", "Thu 3", "Thu 4", "Thu 5", "Thu 6", "Thu 7", "Chua nhat"}; CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 69 POINTER CỦA POINTER cu u du o ng th an co ng c om Cú pháp khai báo pointer sau: kiểu ** tên_pointer Ví dụ: int **pint; int*p; int a[4][4]; pint = &p; pint = (int **) &a; CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 70 cu u du o ng th an co ng c om POINTER CỦA POINTER Thay truy xuất a[i][j], ta truy xuất *(pint + m*i + j), với m số phần tử hàng mảng hai chiều CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 71 POINTER CỦA POINTER cu u du o ng th an co ng c om #include #define MAX_ROW #define MAX_COL main() { int row, col; int *pint1; int a2d [MAX_ROW][MAX_COL] = { {0, 1, 2}, {10, 11, 12}, {20, 21, 22} }; int **pint2; int (*pa2d)[MAX_ROW][MAX_COL]; /* Thu dia chi cua pointer va mang chieu */ CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 72 POINTER CỦA POINTER cu u du o ng th an co ng c om pint1 = a2d[1]; pa2d = &a2d; pint2 = (int **)&a2d; printf ("pint1 = a2d[1] = %p\n", pint1); printf ("*( *( ( int (*)[MAX_COL] ) pint2 + 1)+ 2)= %d\n", *( *( ( int (*)[MAX_COL] ) pint2 + 1)+ 2)); printf ("*( *(a2d + 1) + 2) = %d\n", *( *(a2d + 1) + 2)); printf ("*pint1[2] = %d\n", pint1[2]); printf ("(*pa2d)[1][2] = %d\n", (*pa2d)[1][2]); printf ("Tri cua cac phan tu mang truy xuat qua pointer lan:\n"); CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 73 POINTER CỦA POINTER cu u du o ng th an co ng c om for (row = 0; row < MAX_ROW; row ++) { for (col = 0; col < MAX_COL; col ++) printf ("%d ", *( *( ( int (*)[MAX_COL] ) pint2 + row)+ col)); printf ("\n"); } getchar();} CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 74 POINTER CỦA POINTER c om Ví dụ: ng th an co ng int *m[4]; int a = 1, b = 2, c = 3, d = 4; int **pint; pint = m; m[0] = &a; m[1] = &b; m[2] = &c; m[3] = &d; cu u du o Thay truy xuất trực tiếp a, b, , ta dùng pointer *(pint[i]) CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 75 POINTER CỦA POINTER c om Ví dụ: cu u du o ng th an co ng int ** pi; int * pint[4]; int a[3], b[3], c[3], d[3]; pi = pint; pint[0] = a; pint[1] = b; pint[2] = c; pint[3] = d; CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 76 cu u du o ng th an co ng c om POINTER CỦA POINTER CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 77 ĐỐI SỐ CỦA HÀM MAIN co ng c om C hoàn toàn cho phép việc nhận đối số vào hàm main(), có hai đối số C quy định theo thứ tự: an int agrc: đối số cho biết số tham số nhập, kể tên chương trình char *argv[]: mảng pointer trỏ đến chuỗi tham số theo sau tên chương trình chạy chương trình từ DOS du o u cu ng th CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 78 ĐỐI SỐ CỦA HÀM MAIN cu u du o ng th an co ng c om #include #include main (int argc, char *argv[]) { int i; clrscr(); printf ("Cac doi so cua chuong trinh la: \n"); printf ("Ten chuong trinh la: %s \n", argv[0]); if ( argc >1 ) for (i = 1; i < argc; i++) printf ("Doi so thu %d: %s \n", i, argv[i]); getch(); } CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 79 ĐỐI SỐ CỦA HÀM MAIN c om Nếu nhập từ bàn phím sau: ng C:\>thu_main tin thu 123 co chương trình cho xuất liệu là: cu u du o ng th an Cac doi so cua chuong trinh la: Ten chuong trinh la: C:\thu_main.exe Doi so thu 1: tin Doi so thu 2: thu Doi so thu 3: 123 CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 80 POINTER TRỎ ĐẾN HÀM cu u du o ng int cong (int a, int b) { } th an co ng c om Cú pháp khai báo pointer tới hàm: kiểu (* tên_pointer) (kiểu_các_đối_số); Nếu khai báo int (* p_function) (int, int); có hàm Ta có thể: p_function = cong; tong = (*p_function) (m, n); © TS Nguyễn Phúc Khải CuuDuongThanCong.com https://fb.com/tailieudientucntt 81 Bài tập cu u du o ng th an co ng c om Viết chương trình nhập vào dãy số nguyên (chưa biết có số nguyên) Loại bỏ số nguyên bị lặp lại In dãy số CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 82 .c om ng co an th ng du o u cu CuuDuongThanCong.com © TS Nguyễn Phúc Khải https://fb.com/tailieudientucntt 83 ... CuuDuongThanCong. com © TS Nguyễn Ph? ?c Khải https://fb .com/ tailieudientucntt du o ng th an co ng c om KHÁI NIỆM cu u Hình ảnh stack th? ?c thi điều khiển đến cuối chương trình CuuDuongThanCong. com © TS Nguyễn... Trong C, thao t? ?c th? ?c nhờ hàm strcpy(), hàm c? ? prototype file string.h sau: char *strcpy(char *dest, const char *src); CuuDuongThanCong. com © TS Nguyễn Ph? ?c Khải https://fb .com/ tailieudientucntt... getch(); } CuuDuongThanCong. com © TS Nguyễn Ph? ?c Khải https://fb .com/ tailieudientucntt 44 CHUỖI KÝ TỰ cu u du o ng th an co ng c om Nhập trị chuỗi: Vi? ?c nhập trị cho chuỗi bao gồm hai bư? ?c: