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ỏ - Nguyễn Minh Huy

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

7
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ỏ, được biên soạn gồm các nội dung chính sau Khái niệm con trỏ; Sử dụng con trỏ; Con trỏ vs mảng. 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ỏ - Nguyễn Minh Huy

  1. Con trỏ GV. Nguyễn Minh Huy Kỹ thuật lập trình - Nguyễn Minh Huy 1
  2. Nội dung Khái niệm con trỏ. trỏ. Sử dụng con trỏ. trỏ. Con trỏ vs. mảng. mảng. Kỹ thuật lập trình - Nguyễn Minh Huy 2
  3. Nội dung Khái niệm con trỏ. trỏ. Sử dụng con trỏ. trỏ. Con trỏ vs. mảng. mảng. Kỹ thuật lập trình - Nguyễn Minh Huy 3
  4. Khái niệm con trỏ Bộ nhớ máy tính: tính: RAM (Random Access Memory): (R RAM (4GB) 0 Primary vs. Secondary memory. RAM dùng để chứa: chứa: Hệ điều hành. hành. Chương trình: lệnh + dữ liệu. trình: liệu. … Bao gồm các ô nhớ 1 byte. RAM 4GB ~ 4 tỷ ô nhớ. nhớ. Mỗi ô nhớ có địa chỉ đánh số từ 0. RAM 4GB địa chỉ từ 0 232 – 1. 232 Kỹ thuật lập trình - Nguyễn Minh Huy 4
  5. Khái niệm con trỏ Địa chỉ biến: biến: Điều gì xảy ra khi khai báo biến? biến? Cấp một dãy ô nhớ liên tiếp. tiếp. int x; Gắn tên biến với địa chỉ ô đầu dãy. dãy. 65 66 67 68 Bao nhiêu ô? kiểu dữ liệu. liệu. x ? ? ? ? Địa chỉ biến = địa chỉ ô đầu tiên. tiên. Giá trị biến được lưu thế nào? nào? Chia giá trị biến thành các byte. x = 1057; Lưu mỗi byte vào một ô nhớ. nhớ. 65 66 67 68 Thứ tự lưu: lưu: x 33 4 0 0 Byte thấp đến cao. cao. Ô đầu đến cuối dãy. dãy. Kỹ thuật lập trình - Nguyễn Minh Huy 5
  6. Khái niệm con trỏ Kiểu địa chỉ trong C: Mỗi biến có một địa chỉ. chỉ. Địa chỉ biến có kiểu: *. kiểu: Biến int có địa chỉ kiểu int *. Toán tử &: Công dụng: lấy địa chỉ của biến. dụng: biến. Cú pháp: &; pháp: biến>; x = 1057; int x = 1057; 65 66 67 68 float y = 1.25; x 33 4 0 0 int *address_x = &x; float *address_y = &y; *address_y 91 92 93 94 address_x 65 0 0 0 Kỹ thuật lập trình - Nguyễn Minh Huy 6
  7. Khái niệm con trỏ Con trỏ trong C: Là biến có kiểu địa chỉ. chỉ. Lưu địa chỉ của biến khác. khác. Kích thước con trỏ: trỏ: Bằng nhau dù khác kiểu địa chỉ. chỉ. Bằng kích thước số nguyên int. Tùy thuộc vào hệ máy tính. tính. Ví dụ: dụ: - Hệ máy 16-bit, 2 bytes. 16- - Hệ máy 32-bit, 4 bytes. 32- Kỹ thuật lập trình - Nguyễn Minh Huy 7
  8. Nội dung Khái niệm con trỏ. trỏ. Sử dụng con trỏ. trỏ. Con trỏ vs. mảng. mảng. Kỹ thuật lập trình - Nguyễn Minh Huy 8
  9. Sử dụng con trỏ Khai báo con trỏ: trỏ: Khai báo biến có kiểu địa chỉ. chỉ. Cách 1: *; liệu> trỏ>; int *p1; // Con trỏ kiểu int. float *p2; // Con trỏ kiểu float. Cách 2: typedef * ; liệu> thế>; ; thế> ; typedef int * ConTroInt; ConTroInt; typedef float * ConTroFloat; ConTroFloat; ConTroInt p1; ConTroFloat p2; Kỹ thuật lập trình - Nguyễn Minh Huy 9
  10. Sử dụng con trỏ Khởi tạo con trỏ: trỏ: Con trỏ vừa khai báo nhận địa chỉ nào? nào? Toán tử &: khởi tạo địa chỉ cho con trỏ. trỏ. = &; trỏ> biến>; int x; int *p = &x; Con trỏ kiểu gì thì chỉ nhận địa chỉ của biến kiểu đó!! đó!! float y; int *q = &y; // Sai. Sai. Địa chỉ NULL: Địa chỉ rỗng, không thuộc ô nhớ nào. rỗng, nào. Dùng để khởi tạo địa chỉ mặc định cho con trỏ. trỏ. int *r = NULL; NULL; // r nhận địa chỉ rỗng. rỗng. Kỹ thuật lập trình - Nguyễn Minh Huy 10
  11. Sử dụng con trỏ Truy xuất nội dung vùng nhớ: nhớ: Toán tử *: Công dụng: truy xuất nội dung vùng nhớ con trỏ giữ địa chỉ. dụng: chỉ. Cú pháp: = *; pháp: trỏ>; int x = 5; int *p = &x; int k = *p; *p; // lấy giá trị của x. printf(“%d\ printf(“%d\n”, p); // Xuất địa chỉ x. printf(“%d\ *p); printf(“%d\n”, *p); // Xuất giá trị x. printf(“%d\ &p); printf(“%d\n”, &p); // Xuất địa chỉ p. Con trỏ “trỏ” đến vùng nhớ nó giữ địa chỉ!! trỏ” chỉ!! 72 73 74 75 91 92 93 94 x 5 0 0 0 p 72 0 0 0 Kỹ thuật lập trình - Nguyễn Minh Huy 11
  12. Sử dụng con trỏ Truyền tham số con trỏ: trỏ: void foo( int *g ) foo( { Truyền tham trị: trị: *g = *g + 1; Truyền bản sao con trỏ vào hàm. hàm. g = g + 1; Giá trị con trỏ KHÔNG thay đổi. đổi. } Nội dung vùng nhớ con trỏ “trỏ” đến trỏ” void main() main() CÓ THỂ bị thay đổi. đổi. { int x = 5; int *p = &x; main() 72 73 74 75 foo(int *g) foo(p); foo( x 5 0 0 0 66 67 68 69 foo(&x); foo(&x); g 72 0 0 0 // Giá trị x đổi. đổi. } 91 92 93 94 p 72 0 0 0 Kỹ thuật lập trình - Nguyễn Minh Huy 12
  13. Sử dụng con trỏ Truyền tham số con trỏ: trỏ: void foo( int *&g ) foo( *&g { Truyền tham chiếu: chiếu: *g = *g + 1; Truyền bản gốc con trỏ vào hàm. hàm. g=g+1 Giá trị con trỏ CÓ THỂ thay đổi. đổi. } Nội dung vùng nhớ con trỏ “trỏ” đến trỏ” void main() main() CÓ THỂ bị thay đổi. đổi. { int x = 5; int *p = &x; main() 72 73 74 75 foo(p); foo( x 5 0 0 0 foo(&x); // Sai foo(&x); // Giá trị x đổi. đổi. 91 92 93 94 foo(int *&g) // Giá trị p đổi. đổi. p 72 0 0 0 g } Kỹ thuật lập trình - Nguyễn Minh Huy 13
  14. Sử dụng con trỏ Con trỏ cấu trúc: trúc: Giữ địa chỉ biến cấu trúc. trúc. Khai báo: báo: Cách 1: *; trỏ>; Cách 2: typedef * ; trúc> thế>; ; thế> ; struct PhanSo { int tu, mau; tu, mau; }; typedef PhanSo * ConTroPhanSo; ConTroPhanSo; PhanSo *p; ConTroPhanSo q; Kỹ thuật lập trình - Nguyễn Minh Huy 14
  15. Sử dụng con trỏ Con trỏ cấu trúc: trúc: Truy xuất thành phần: phần: Cách 1: (*).; (*< trỏ> .; Cách 2: ->; phần>; PhanSo p; ConTroPhanSo q = &p; (*q).tu = 1; (*q q->mau = 2; Kỹ thuật lập trình - Nguyễn Minh Huy 15
  16. Nội dung Khái niệm con trỏ. trỏ. Sử dụng con trỏ. trỏ. Con trỏ vs. mảng. mảng. Kỹ thuật lập trình - Nguyễn Minh Huy 16
  17. Con trỏ vs. mảng Mảng trong C: Là một con trỏ. trỏ. Giữ địa chỉ phần tử đầu tiên. tiên. void main() main() { int a[ 10 ]; printf(“%d\ printf(“%d\n”, a); printf(“%d\ &a[0]); printf(“%d\n”, &a[0]); // a == &a[0]. } a[0] a[1] a[2] 72 73 74 75 76 77 78 79 80 81 82 83 a 1 0 0 0 2 0 0 0 3 0 0 0 … Kỹ thuật lập trình - Nguyễn Minh Huy 17
  18. Con trỏ vs. mảng Con trỏ đến mảng: mảng: Truy xuất mảng gián tiếp. tiếp. Xét đoạn chương trình sau: sau: int a[100] = { 1, 2, 3 }; int *p = a; a; *p = *p + 1; printf(“%d\ printf(“%d\n”, *p); Cơ chế hoạt động: động: a[0] a[1] a[2] 72 73 74 75 76 77 78 79 80 81 82 83 a 1 0 0 0 2 0 0 0 3 0 0 0 … 44 45 46 47 p 72 0 0 0 Kỹ thuật lập trình - Nguyễn Minh Huy 18
  19. Con trỏ vs. mảng Phép toán tăng, giảm con trỏ: tăng, trỏ: Giá trị con trỏ tăng giảm theo kích thước kiểu dữ liệu. liệu. Công thức: thức: +/- k = +/- k * sizeof(). trỏ> +/- +/- sizeof(). int a[100] = { 1, 2, 3 }; int *p = a; a; printf(“%d\ printf(“%d\n”, p + 1); 1); printf(“%d\ printf(“%d\n”, *(p + 2) ); a[0] a[1] a[2] 72 73 74 75 76 77 78 79 80 81 82 83 a 1 0 0 0 2 0 0 0 3 0 0 0 … 44 45 46 47 p+1 p+2 p 72 0 0 0 Kỹ thuật lập trình - Nguyễn Minh Huy 19
  20. Con trỏ vs. mảng Toán tử [ ]: Truy xuất nội dung vùng nhớ con trỏ giữ địa chỉ. chỉ. Công thức: thức: [] ~ * ( + ) trỏ>[] trỏ> ) int a[100] = { 1, 2, 3 }; int *p = a; a[2] = 5; *(a + 2) = 5; *(p + 2) = 5; p[2] = 5; 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