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

Bài giảng Cơ sở lập trình 1: Chương 6 - Lê Quý Tài

Chia sẻ: Kiếp Này Bình Yên | Ngày: | Loại File: PPTX | Số trang:50

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

Bài giảng Cơ sở lập trình 1 - Chương 6 trang bị cho người học những kiến thức về kiểu con trỏ. Các nội dung chính được trình bày trong chương này gồm có: Con trỏ và địa chỉ, khai báo con trỏ, con trỏ và mảng một chiều, con trỏ và mảng nhiều chiều, mảng các con trỏ,... Mời các bạn cùng tham khảo.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Cơ sở lập trình 1: Chương 6 - Lê Quý Tài

  1. Chương 6 KIỂU CON TRỎ Khoa Hệ thống thông tin quản lý Hà Nội – 2015
  2. Nội dung 1 Con trỏ và địa chỉ 2 Khai báo con trỏ 3 Con trỏ và mảng một chiều 4 Con trỏ và mảng nhiều chiều 5 Mảng các con trỏ 6 Con trỏ hàm 7 Cấp phát bộ nhớ động 12/24/15 Chương 6-Kiểu con trỏ 2
  3. 1. Con trỏ và địa chỉ o Ví dụ: float a=10.12; n Xác định một biến có tên a có kiểu float và có giá trị 10.12. n Máy cấp phát cho x một vùng nhớ gồm 4 byte liên tiếp. n Địa chỉ của biến là số thứ tự của byte đầu tiên o Có nhiều kiểu địa chỉ khác nhau tương ứng với các kiểu biến khác nhau. 12/24/15 Chương 6-Kiểu con trỏ 3/50
  4. Con trỏ và địa chỉ o Con trỏ là một biến dùng để chứa địa chỉ. Có nhiều kiểu con trỏ tương ứng với nhiều loại địa chỉ. n Ví dụ: o Con trỏ kiểu int chứa địa chỉ các biến kiểu int… o *a là giá trị được lưu trong bộ nhớ có địa chỉ a o &a là địa chỉ bộ nhớ chứa giá trị a 12/24/15 Chương 6-Kiểu con trỏ 4/50
  5. 2. Khai báo con trỏ o Khai báo trực tiếp *; Trong đó: * là toán tử con trỏ n Ví dụ: int *p1,m,n; p1=&n; *p1=10; /* ô nhớ do con trỏ p1 trỏ đến được gán giá trị 10 */ o Chú ý: Khi gán địa chỉ của 1 biến cho 1 biến con trỏ, mọi sự thay đổi trên nội dung ô nhớ con trỏ chỉ tới sẽ làm giá trị của biến thay đổi theo. n Ví dụ: int *p2,a=10; p2=&a; *p2=*p2+3; Khi đó a sẽ có giá trị 13. 12/24/15 Chương 6-Kiểu con trỏ 5/50
  6. Khai báo con trỏ (tt) o Khai báo gián tiếp typedef *; ; n Ví dụ typedef int *pint; int *p1; pint p2, p3; o Kích thước của con trỏ n Con trỏ chỉ lưu địa chỉ nên kích thước của mọi con trỏ là như nhau: o Môi trường MD-DOS (16 bit): 2 bytes o Môi trường Windows (32 bit): 4 bytes 12/24/15 Chương 6-Kiểu con trỏ 6/50
  7. Con trỏ NULL o Khái niệm n Con trỏ NULL là con trỏ không trỏ và đâu cả. n Khác với con trỏ chưa được khởi tạo. int n; int *p1 = &n; int *p2; // unreferenced local varialbe int *p3 = NULL; NULL 12/24/15 Chương 6-Kiểu con trỏ 7/50
  8. Khởi tạo kiểu con trỏ o Khởi tạo = &; n Khi mới khai báo, biến con trỏ được đặt ở địa chỉ nào đó (không biết trước).  chứa giá trị không xác định  trỏ đến vùng nhớ không biết trước. n Đặt địa chỉ của biến vào con trỏ (toán tử &) o Ví dụ int a, b; int *pa = &a, *pb; pb = &b; 12/24/15 Chương 6-Kiểu con trỏ 8/50
  9. Sử dụng con trỏ o Truy xuất đến ô nhớ mà con trỏ trỏ đến n Con trỏ chứa một số nguyên chỉ địa chỉ. n Sử dụng toán tử *. o Ví dụ int n=10; int *p; printf("\nDia chi cua n: %p",&n); printf("\nGia tri cua n: %d",n); p=&n; //Con tro p tro toi n printf("\nDia chi cua con tro: %p",&p); printf("\nGia tri cua con tro: %p",p); printf("\nGia tri duoc tro toi la: %d",*p); 12/24/15 Chương 6-Kiểu con trỏ 9/50
  10. Sử dụng con trỏ (tt) o Sử dụng tên con trỏ n Giá trị của con trỏ (địa chỉ của biến) được sử dụng trong biểu thức n Nếu tên con trỏ ở bên trái toán tử gán thì giá trị của biểu thức bên phải phải là địa chỉ. n Ví dụ: float a,*p,*q; p=&a; q=p;  Kết quả con trỏ q chứa địa chỉ của biến a o Sử dụng dạng khai báo n Ví dụ: float x,*px; px=&x; //px trỏ tới x n Nếu con trỏ px trỏ tới biến x thì cách viết x và *px là tương đương trong mọi ngữ cảnh. 12/24/15 Chương 6-Kiểu con trỏ 10/50
  11. Các cách truyền đối số o Truyền giá trị (tham trị) #include void hoanvi(int x, int y); main() { int a = 5; b = 6; hoanvi(a, b); printf(“a = %d, b = %d”, a, b); } void hoanvi(int x, int y) { int t = x; x = y; y = t; } 12/24/15 Chương 6-Kiểu con trỏ 11/50
  12. Các cách truyền đối số o Truyền địa chỉ (con trỏ) #include void hoanvi(int *x, int *y); main() { int a = 2912; b = 1706; hoanvi(&a, &b); printf(“a = %d, b = %d”, a, b); } void hoanvi(int *x, int *y) { int t = *x; *x = *y; *y = t; } 12/24/15 Chương 6-Kiểu con trỏ 12/50
  13. Các cách truyền đối số o Truyền tham chiếu (C++) #include void hoanvi(int &x, int &y); main() { int a = 2912; b = 1706; hoanvi(a, b); printf(“a = %d, b = %d”, a, b); } void hoanvi(int &x, int &y) { int t = x; x = y; y = t; } 12/24/15 Chương 6-Kiểu con trỏ 13/50
  14. Một số lưu ý o Một số lưu ý n Con trỏ là khái niệm quan trọng và khó nhất trong C. n Nắm rõ quy tắc sau, ví dụ int a, *pa = &a; o *pa và a đều chỉ nội dung của biến a. o pa và &a đều chỉ địa chỉ của biến a. n Không nên sử dụng con trỏ khi chưa được khởi tạo. Kết quả sẽ không lường trước được. n Ví dụ: int *pa; *pa = 1904; 12/24/15 Chương 6-Kiểu con trỏ 14/50
  15. 3. Con trỏ và mảng một chiều o Mảng một chiều int array[3]; n Tên mảng array là một hằng con trỏ  không thể thay đổi giá trị của hằng này. n array là địa chỉ đầu tiên của mảng array == &array[0] 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … … array 12/24/15 Chương 6-Kiểu con trỏ 15/50
  16. Con trỏ và mảng một chiều o Con trỏ đến mảng một chiều int array[3], *parray; parray = array; // Cách 1 parray = &array[0]; // Cách 2 18 19 1A 1B 1C 1D 1E 1F … 0B 00 00 00 … parray 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … … array 12/24/15 Chương 6-Kiểu con trỏ 16/50
  17. Phép toán số học trên con trỏ o Phép cộng (tăng) n + n  + n * sizeof() n Có thể sử dụng toán tử gộp += hoặc ++ p = array +2 +1 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … … int array[3]; 12/24/15 Chương 6-Kiểu con trỏ 17/50
  18. Phép toán số học trên con trỏ o Phép trừ (giảm) n – n  – n * sizeof() n Có thể sử dụng toán tử gộp –= hoặc – – p = &array[2] –2 –1 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … … int array[3]; 12/24/15 Chương 6-Kiểu con trỏ 18/50
  19. Phép toán số học trên con trỏ o Phép toán tính khoảng cách giữa 2 con trỏ n *p1, *p2; n p1 – p2 cho ta khoảng cách (theo số phần tử) giữa hai con trỏ (cùng kiểu) p1 = array p2 = &array[2] p1 – p2= (0B – 13)/sizeof(int) = –2 p2 – p1= (13 – 0B)/sizeof(int) = +2 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … … int array[3]; 12/24/15 Chương 6-Kiểu con trỏ 19/50
  20. Phép toán số học trên con trỏ o Các phép toán khác n Phép so sánh: So sánh địa chỉ giữa hai con trỏ (thứ tự ô nhớ) o == != o > >= o <
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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