Bài giảng Kỹ thuật lập trình: Con trỏ nâng cao - Nguyễn Minh Huy
lượt xem 3
download
Bài giảng Kỹ thuật lập trình: Con trỏ nâng cao, được biên soạn gồm các nội dung chính sau Quản lý bộ nhớ; Con trỏ nhiều cấp; Các loại con trỏ khác. Mời các bạn cùng tham khảo!
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Kỹ thuật lập trình: Con trỏ nâng cao - Nguyễn Minh Huy
- Con trỏ nâng cao GV. Nguyễn Minh Huy Kỹ thuật lập trình - Nguyễn Minh Huy 1
- Nội dung Quản lý bộ nhớ. nhớ. Con trỏ nhiều cấp. cấp. Các loại con trỏ khác. khác. Kỹ thuật lập trình - Nguyễn Minh Huy 2
- Nội dung Quản lý bộ nhớ. nhớ. Con trỏ nhiều cấp. cấp. Các loại con trỏ khác. khác. Kỹ thuật lập trình - Nguyễn Minh Huy 3
- Quản lý bộ nhớ Cấp phát bộ nhớ trong C: Xin một vùng nhớ trong RAM để sử dụng. dụng. Lệnh malloc: thư viện malloc: malloc.h> Cú pháp: malloc(); pháp: malloc( phát> Trả về: địa chỉ vùng nhớ được cấp. về: cấp. int *p = (int *) malloc( 2 * sizeof(int) ); (int malloc( sizeof(int) PhanSo *q = (PhanSo *) malloc( 2 * sizeof(PhanSo) ); (PhanSo malloc( sizeof(PhanSo) 44 45 46 47 72 73 74 75 76 77 78 79 p 72 0 0 0 ? ? ? ? ? ? ? ? p+1 tu mau tu mau 33 34 35 36 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 q 55 0 0 0 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? q+1 Kỹ thuật lập trình - Nguyễn Minh Huy 4
- Quản lý bộ nhớ Thu hồi bộ nhớ trong C: Trả lại vùng nhớ đã xin của RAM. Quy tắc quản lý bộ nhớ của C: Tự thu hồi vùng nhớ khai báo biến. biến. Không thu hồi vùng nhớ tự cấp phát. phát. Lập trình viên phải tự thu hồi vùng nhớ cấp phát. phát. Quên thu hồi “Rò rỉ” bộ nhớ (memory leak). rỉ” Lệnh free: thư viện malloc.h> Cú pháp: free(); pháp: free( float *r = (float *) malloc( 20 * sizeof(float) ); malloc( sizeof(float) free(r free(r); Kỹ thuật lập trình - Nguyễn Minh Huy 5
- Quản lý bộ nhớ Cấp phát và thu hồi trong C++: C++ tương thích với C (hỗ trợ malloc). (hỗ malloc). C++ có lệnh cấp phát và thu hồi mới. mới. Toán tử new: cấp phát bộ nhớ. new: nhớ. Cú pháp: new []; pháp: liệu> tử> Trả về: địa chỉ vùng nhớ được cấp. về: cấp. Toán tử delete: thu hồi bộ nhớ. delete: nhớ. Cú pháp: delete ; pháp: nhớ>; int *p = new int [ 10 ]; PhanSo *q = new PhanSo [ 30 ]; delete [ ]p; delete [ ]q; Kỹ thuật lập trình - Nguyễn Minh Huy 6
- Quản lý bộ nhớ Mảng động một chiều: chiều: Không cần biết số phần tử khi khai báo. báo. Cấp phát vùng nhớ khi cần. cần. Thu hồi vùng nhớ khi sử dụng xong. xong. Sử dụng bộ nhớ hiệu quả hơn. hơn. void nhapMang(int *&a, int &n) { nhapMang( *&a, &n) void main() main() printf(“Nhap printf(“Nhap so phan tu: “); tu: { scanf(“%d”, &n); scanf(“%d”, &n); int *a; *a; a = new int [ n ]; int n; for (int i = 0; i < n; i++) { (int nhapMang(a, nhapMang(a, n); printf(“Nhap printf(“Nhap phan tu %d:”, i); delete [ ]a; scanf(“%d”, scanf(“%d”, &a[ i ]); } } } Kỹ thuật lập trình - Nguyễn Minh Huy 7
- Nội dung Quản lý bộ nhớ. nhớ. Con trỏ nhiều cấp. cấp. Các loại con trỏ khác. khác. Kỹ thuật lập trình - Nguyễn Minh Huy 8
- Con trỏ nhiều cấp Địa chỉ của con trỏ: trỏ: Mỗi biến có một địa chỉ. chỉ. Biến int có kiểu địa chỉ int *. Biến con trỏ cũng có địa chỉ. chỉ. Biến int * có kiểu địa chỉ là gì? gì? Khái niệm con trỏ nhiều cấp: cấp: Biến giữ địa chỉ của con trỏ. trỏ. Còn gọi là con trỏ của con trỏ. trỏ. Có kiểu là: *. là: Kỹ thuật lập trình - Nguyễn Minh Huy 9
- Con trỏ nhiều cấp Sử dụng con trỏ cấp 2 trong C: Khai báo: báo: Cách 1: dùng dấu *. Cách 2: dùng từ khóa typedef. typedef. Khởi tạo: tạo: Khởi tạo NULL. NULL. Khởi tạo bằng toán tử &. 72 73 74 75 int x = 257; x 1 1 0 0 int *p = NULL; NULL; 44 45 46 47 int **q = NULL; **q NULL; p 72 0 0 0 p = &x; 96 97 98 99 q = &p; q 44 0 0 0 Kỹ thuật lập trình - Nguyễn Minh Huy 10
- Con trỏ nhiều cấp Sử dụng con trỏ cấp 2 trong C: Truy xuất nội dung vùng nhớ: nhớ: void foo(int **g, int **&h) foo( **g, **&h) Truy xuất 1 cấp: toán tử *. cấp: { (**g)++; (*g)++; g++; Truy xuất 2 cấp: toán tử **. cấp: **. (**h)++; (*h)++; h++; Truyền tham số: số: } Truyền tham trị. trị. void main() main() Truyền tham chiếu. chiếu. { int a[10]; int *p = a; Những giá trị nào thay đổi int **q = &p; trong hàm foo? foo? int **r = &p; foo(q, r); foo( r); } Kỹ thuật lập trình - Nguyễn Minh Huy 11
- Con trỏ nhiều cấp Mảng nhiều chiều động: động: Mảng con trỏ: trỏ: Con trỏ cấp 1 là mảng động một chiều. chiều. Con trỏ cấp 2 là mảng động các con trỏ cấp 1. Dùng làm mảng động nhiều chiều.chiều. void nhapMang(int **&a, int &dong, int &cot) { nhapMang( **&a, &dong, &cot) scanf(“%d scanf(“%d %d”, &dong, &cot); &dong, &cot); a = new int * [ dong ]; void main() main() for (int i = 0; i < dong; i++) { (int { a[ i ] = new int [ cot ]; int **a; **a; for (int j = 0; j < cot; j++) (int int dong, cot; scanf(“%d”, scanf(“%d”, &a[ i ][ j ]); ]); nhapMang(a, nhapMang(a, dong, cot); } delete [ ]a; } } Kỹ thuật lập trình - Nguyễn Minh Huy 12
- Nội dung Quản lý bộ nhớ. nhớ. Con trỏ nhiều cấp. cấp. Các loại con trỏ khác. khác. Kỹ thuật lập trình - Nguyễn Minh Huy 13
- Các loại con trỏ khác Hằng con trỏ (constant pointer): Con trỏ suốt đời giữ 1 địa chỉ (khi khởi tạo). tạo). Khai báo: * const ; báo: trỏ>; int x = 5, y = 6; int * const p = &x; p = &y; // Sai. Sai. Tất cả mảng tĩnh trong C đều là hằng con trỏ. trỏ. Con trỏ hằng (pointer to constant): Nội dung vùng nhớ con trỏ giữ địa chỉ là hằng. hằng. Khai báo: const * ; báo: liệu> trỏ>; int x = 5; const int *p = &x; *p = 6; // Sai. Sai. Kỹ thuật lập trình - Nguyễn Minh Huy 14
- Các loại con trỏ khác Con trỏ void: Giữ địa chỉ kiểu bất kỳ. kỳ. Có kiểu void *. Ép về kiểu địa chỉ mong muốn khi dùng. dùng. void inByteVungNho(void *p, int size) inByteVungNho( *p, void main() main() { { char *q = ( unsigned char * ) p; int x = 1057; for ( int i = 0; i < size; i++ ) double y = 1.25; printf( printf( “%d “, q[ i ] ); inByteVungNho(&x, inByteVungNho(&x, 4); } inByteVungNho(&y, inByteVungNho(&y, 8); } Kỹ thuật lập trình - Nguyễn Minh Huy 15
- Các loại con trỏ khác Con trỏ hàm: hàm: Địa chỉ hàm: hàm: Hàm được lưu trong bộ nhớ như biến. biến. Mỗi hàm có một địa chỉ. chỉ. Con trỏ hàm là biến giữ địa chỉ hàm. hàm. Khai báo: báo: (* ) (); về> trỏ> số>); typedef (* ) (); về> thế> số>); ; thế> ; Các hàm có cùng kiểu địa chỉ khi: khi: Cùng kiểu trả về. về. Cùng danh sách tham số. số. Kỹ thuật lập trình - Nguyễn Minh Huy 16
- Các loại con trỏ khác Con trỏ hàm: hàm: typedef int (*PhepTinh)(int a, int b); (*PhepTinh)(int void main() main() { int cong(int u, int v) cong( int x = 5; { int y = 6; return u + v; PhepTinh p = cong; cong; } int kq1 = p(x, y); int nhan(int u, int v) nhan( { p = nhan; nhan; return u * v; int kq2 = p(x, y); } int tinhToan(int u, int v, PhepTinh p) tinhToan( int kq3 = tinhToan(x, y, cong); tinhToan(x, cong); { // u3 operator v2. } return p(u*u*u, v*v); } Kỹ thuật lập trình - Nguyễn Minh Huy 17
- Các loại con trỏ khác Con trỏ đến vùng nhớ kích thước cố định: định: Địa chỉ của mảng một chiều tĩnh: tĩnh: Mảng một chiều tĩnh có kiểu địa chỉ thế nào? nào? int a[ 10 ]; int *p = a // p và a là địa chỉ của a[ 0 ]. ??? q = &a; Con trỏ đến vùng nhớ kích thước cố định: định: Biến giữ địa chỉ của mảng 1 chiều tĩnh.tĩnh. Khai báo: báo: (*)[]; mảng> (*< trỏ>)[< mảng> int a[ 10 ]; int ( *p )[ 10 ] = &a; // p chỉ trỏ đến vùng nhớ // có kích thước 10 phần tử. tử. Kỹ thuật lập trình - Nguyễn Minh Huy 18
- Các loại con trỏ khác Con trỏ đến vùng nhớ kích thước cố định: định: Bản chất mảng hai chiều tĩnh trong C: Là con trỏ giữ địa chỉ mảng 1 chiều tĩnh. tĩnh. Giữ địa chỉ dòng đầu tiên. tiên. int a[ 2 ] [ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } }; int ( *p )[ 3 ] = a; // a = &a[ 0 ]. printf(“%d\ printf(“%d\n”, *( *(p + 1) + 1 ) ); *(p 1) a[0][0] a[0][1] a[0][2] 44 45 46 47 72 73 74 75 76 77 78 79 80 81 82 83 p 72 0 0 0 a[0] 1 0 0 0 2 0 0 0 3 0 0 0 a[1][0] a[1][1] a[1][2] 84 85 86 87 88 89 90 91 92 93 94 95 a[1] 4 0 0 0 5 0 0 0 6 0 0 0 p+1 *(p + 1) + 1 Kỹ thuật lập trình - Nguyễn Minh Huy 19
- Các loại con trỏ khác Con trỏ đến vùng nhớ kích thước cố định: định: Truyền tham số mảng hai chiều tĩnh: tĩnh: Không phải truyền tất cả mảng. mảng. Chỉ truyền địa chỉ dòng đầu tiên. tiên. void xuatMang(int a[ ][20], int dong, int cot) { // truyền &a[ 0 ]. xuatMang( ][20], for (int i = 0; i < dong; i++) { (int for (int j = 0; j < cot; j++) (int printf(“%d printf(“%d “, a[ i ][ j ] ); printf(“\ printf(“\n”); } } void main() { main() int a[10][20]; xuatMang( xuatMang(a, 10, 20); } Kỹ thuật lập trình - Nguyễn Minh Huy 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng Kỹ thuật lập trình - Phạm Thế Bảo
0 p | 220 | 32
-
Bài giảng Kỹ thuật lập trình: Chương I - Lưu Hồng Việt
48 p | 194 | 23
-
Bài giảng Kỹ thuật lập trình: Chương II - Lưu Hồng Việt
74 p | 182 | 18
-
Bài giảng Kỹ thuật lập trình: Chương IV - Lưu Hồng Việt
32 p | 151 | 17
-
Bài giảng Kỹ thuật lập trình Programing technique - Vũ Đức Vượng
68 p | 221 | 16
-
Bài giảng Kỹ thuật lập trình: Chương V - Lưu Hồng Việt
19 p | 127 | 15
-
Bài giảng Kỹ thuật lập trình: Chương III - Lưu Hồng Việt
51 p | 147 | 15
-
Bài giảng Kỹ thuật lập trình: Chương VI - Lưu Hồng Việt
27 p | 133 | 11
-
Bài giảng Kỹ thuật lập trình: Phần 1 - ĐH CNTT&TT
37 p | 114 | 10
-
Bài giảng Kỹ thuật lập trình - Bài 1: Tổng quan về kỹ thuật lập trình
65 p | 165 | 8
-
Bài giảng Kỹ thuật lập trình: Bài 1 - Phạm Đình Sắc
9 p | 129 | 7
-
Bài giảng Kỹ thuật lập trình nâng cao: Chương 4 - ThS. Dương Thành Phết
26 p | 92 | 7
-
Bài giảng Kỹ thuật lập trình: Chương 1 - Trần Minh Thái, Phạm Đức Thành
50 p | 117 | 6
-
Bài giảng Kỹ thuật lập trình - TS. Vũ Hương Giang
8 p | 117 | 5
-
Bài giảng Kỹ thuật lập trình: Bài 2 - Phạm Đình Sắc
7 p | 117 | 5
-
Bài giảng Kỹ thuật lập trình - Chương 10: Tổng kết môn học (Trường Đại học Bách khoa Hà Nội)
67 p | 15 | 4
-
Bài giảng Kỹ thuật lập trình - Chương 1: Tổng quan về kỹ thuật lập trình
45 p | 55 | 3
-
Bài giảng Kỹ thuật lập trình - Chương 1: Tổng quan về kỹ thuật lập trình (Trường Đại học Bách khoa Hà Nội)
46 p | 12 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn