intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Kỹ thuật lập trình: Con trỏ nâng cao - Nguyễn Minh Huy

Chia sẻ: _ _ | Ngày: | Loại File: PDF | Số trang:27

8
lượt xem
3
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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!

Chủ đề:
Lưu

Nội dung Text: Bài giảng Kỹ thuật lập trình: Con trỏ nâng cao - Nguyễn Minh Huy

  1. Con trỏ nâng cao GV. Nguyễn Minh Huy Kỹ thuật lập trình - Nguyễn Minh Huy 1
  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 2
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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
  13. 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
  14. 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
  15. 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
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2