Bài giảng Ngôn ngữ lập trình - Chương 9: Con trỏ cơ bản

ppt
Số trang Bài giảng Ngôn ngữ lập trình - Chương 9: Con trỏ cơ bản 38 Cỡ tệp Bài giảng Ngôn ngữ lập trình - Chương 9: Con trỏ cơ bản 4 MB Lượt tải Bài giảng Ngôn ngữ lập trình - Chương 9: Con trỏ cơ bản 0 Lượt đọc Bài giảng Ngôn ngữ lập trình - Chương 9: Con trỏ cơ bản 12
Đánh giá Bài giảng Ngôn ngữ lập trình - Chương 9: Con trỏ cơ bản
4.4 ( 17 lượt)
Nhấn vào bên dưới để tải tài liệu
Để tải xuống xem đầy đủ hãy nhấn vào bên trên
Chủ đề liên quan

Nội dung

&& VC VC BB BB Nội dung 1 Khái niệm và cách sử dụng 2 Các cách truyền đối số cho hàm 3 Con trỏ và mảng một chiều 4 Con trỏ và cấu trúc NMLT - Con trỏ cơ bản 1 && VC VC BB BB Kiến trúc máy tính  Bộ nhớ máy tính  Bộ nhớ RAM chứa rất nhiều ô nhớ, mỗi ô nhớ có kích thước 1 byte.  RAM dùng để chứa một phần hệ điều hành, các lệnh chương trình, các dữ liệu…  Mỗi ô nhớ có địa chỉ duy nhất và địa chỉ này được đánh số từ 0 trở đi.  Ví dụ • RAM 512MB được đánh địa chỉ từ 0 đến 229 – 1 • RAM 2GB được đánh địa chỉ từ 0 đến 231 – 1 NMLT - Con trỏ cơ bản 2 && VC VC BB BB Khai báo biến trong C  Quy trình xử lý của trình biên dịch  Dành riêng một vùng nhớ với địa chỉ duy nhất để lưu biến đó.  Liên kết địa chỉ ô nhớ đó với tên biến.  Khi gọi tên biến, nó sẽ truy xuất tự động đến ô nhớ đã liên kết với tên biến.  Ví dụ: int a = 0x1234; // Giả sử địa chỉ 0x0B 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 34 12 00 00 a … NMLT - Con trỏ cơ bản 3 && VC VC BB BB Khái niệm con trỏ  Khái niệm  Địa chỉ của biến là một con số.  Ta có thể tạo biến khác để lưu địa chỉ của biến này  Con trỏ. 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 34 12 00 00 a 0B 00 00 00 pa … NMLT - Con trỏ cơ bản 4 && VC VC BB BB Khai báo con trỏ  Khai báo  Giống như mọi biến khác, biến con trỏ muốn sử dụng cũng cần phải được khai báo *;  Ví dụ char *ch1, *ch2; int *p1, p2;  ch1 và ch2 là biến con trỏ, trỏ tới vùng nhớ kiểu char (1 byte).  p1 là biến con trỏ, trỏ tới vùng nhớ kiểu int (4 bytes) còn p2 là biến kiểu int bình thường. NMLT - Con trỏ cơ bản 5 && VC VC BB BB Khai báo con trỏ  Sử dụng từ khóa typedef typedef *; ;  Ví dụ typedef int *pint; int *p1; pint p2, p3;  Lưu ý khi khai báo kiểu dữ liệu mới  Giảm bối rối khi mới tiếp xúc với con trỏ.  Nhưng dễ nhầm lẫn với biến thường. NMLT - Con trỏ cơ bản 6 && VC VC BB BB Con trỏ NULL  Khái niệm  Con trỏ NULL là con trỏ không trỏ và đâu cả.  Khác với con trỏ chưa được khởi tạo. int int int int n; *p1 = &n; *p2; // unreferenced local varialbe *p3 = NULL; NULL NMLT - Con trỏ cơ bản 7 && VC VC BB BB Khởi tạo kiểu con trỏ  Khởi tạo  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.  Đặt địa chỉ của biến vào con trỏ (toán tử &) = &;  Ví dụ int a, b; int *pa = &a, *pb; pb = &b; NMLT - Con trỏ cơ bản 8 && VC VC BB BB Sử dụng con trỏ  Truy xuất đến ô nhớ mà con trỏ trỏ đến  Con trỏ chứa một số nguyên chỉ địa chỉ.  Vùng nhớ mà nó trỏ đến, sử dụng toán tử *.  Ví dụ int a = 5, *pa printf(“%d\n”, printf(“%d\n”, printf(“%d\n”, = &a; pa); // Giá trị biến pa *pa); // Giá trị vùng nhớ pa trỏ đến &pa); // Địa chỉ biến pa 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 05 00 00 00 a 0B 00 00 00 pa … NMLT - Con trỏ cơ bản 9 && VC VC BB BB Kích thước của con trỏ  Kích thước của con trỏ char *p1; int *p2; float *p3; double *p4; …  Con trỏ chỉ lưu địa chỉ nên kích thước của mọi con trỏ là như nhau: • Môi trường MD-DOS (16 bit): 2 bytes • Môi trường Windows (32 bit): 4 bytes NMLT - Con trỏ cơ bản 1 0 && VC VC BB BB Các cách truyền đối số  Truyền giá trị (tham trị) #include void hoanvi(int x, int y); void 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; } NMLT - Con trỏ cơ bản 1 1 && VC VC BB BB Truyền giá trị (tham trị) int x int y 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 … 05 00 00 00 06 00 00 00 hoanvi int x int y … int t = x; x = y; y = t; 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 05 00 00 00 06 00 00 00 int a = 5 int b = 6 … NMLT - Con trỏ cơ bản 1 2 && VC VC BB BB Các cách truyền đối số  Truyền địa chỉ (con trỏ) #include void hoanvi(int *x, int *y); void 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; } NMLT - Con trỏ cơ bản 1 3 && VC VC BB BB Truyền địa chỉ (con trỏ) int *x int *y 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 … 0B 00 00 00 0F 00 00 00 hoanvi int *x int *y … int t = *x; *x = *y; *y = *t; 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 05 00 00 00 06 00 00 00 int a = 5 int b = 6 … NMLT - Con trỏ cơ bản 1 4 && VC VC BB BB Các cách truyền đối số  Truyền tham chiếu (C++) #include void hoanvi(int &x, int &y); void main() { int a = 2912; b = hoanvi(a, b); printf(“a = %d, b } void hoanvi(int &x, int { int t = x; x = y; } 1706; = %d”, a, b); &y) y = t; NMLT - Con trỏ cơ bản 1 5 && VC VC BB BB Truyền tham chiếu (C++) hoanvi int &x int &y int t = x; x = y; y = t; 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … 05 00 00 00 06 00 00 00 int a = 5 int b = 6 … NMLT - Con trỏ cơ bản 1 6 && VC VC BB BB Một số lưu ý  Một số lưu ý  Con trỏ là khái niệm quan trọng và khó nhất trong C. Mức độ thành thạo C được đánh giá qua mức độ sử dụng con trỏ.  Nắm rõ quy tắc sau, ví dụ int a, *pa = &a; • *pa và a đều chỉ nội dung của biến a. • pa và &a đều chỉ địa chỉ của biến a.  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 intđược. *pa; *pa = 1904; NMLT - Con trỏ cơ bản 1 7 && Con trỏ và mảng một chiều VC VC BB BB  Mảng một chiều int array[3];  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.  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 NMLT - Con trỏ cơ bản 1 8 && VC VC BB BB Con trỏ và mảng một chiều  Con trỏ đến mảng một chiều int array[3], *parray; parray = array; parray = &array[0]; // Cách 1 // 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 NMLT - Con trỏ cơ bản 1 9 && VC VC BB BB Phép toán số học trên con trỏ  Phép cộng (tăng)  + n  + n * sizeof()  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]; … NMLT - Con trỏ cơ bản 2 0 && VC VC BB BB Phép toán số học trên con trỏ  Phép trừ (giảm)  – n  – n * sizeof()  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]; … NMLT - Con trỏ cơ bản 2 1 && VC VC BB BB Phép toán số học trên con trỏ  Phép toán tính khoảng cách giữa 2 con trỏ  *p1, *p2;  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]; … NMLT - Con trỏ cơ bản 2 2 && VC VC BB BB Phép toán số học trên con trỏ  Các phép toán khác  Phép so sánh: So sánh địa chỉ giữa hai con trỏ (thứ tự ô nhớ) • == •> •< != >= <=  Không thể thực hiện các phép toán: * / % NMLT - Con trỏ cơ bản 2 3 && VC VC BB BB Con trỏ và mảng một chiều  Truy xuất đến phần tử thứ n của mảng (không sử dụng biến mảng)  array[n] == p[n] == *(p + n) * ( p + 2 ) 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 … int array[3]; … NMLT - Con trỏ cơ bản 2 4 && VC VC BB BB Con trỏ và mảng một chiều  Ví dụ nhập mảng void main() { int a[10], n = 10, *pa; pa = a; // hoặc pa = &a[0]; for (int i = 0; i)  Không thể tăng/giảm biến mảng. Hãy gán một con trỏ đến địa chỉ đầu của mảng và tăng/giảm nó.  Đối số mảng một chiều truyền cho hàm là địa chỉ phần tử đầu tiên của mảng. NMLT - Con trỏ cơ bản 2 9 && VC VC BB BB Con trỏ cấu trúc  Truy xuất bằng 2 cách -> (*).  Ví dụ struct PHANSO { int tu, mau; }; PHANSO ps1, *ps2 = &p1; // ps2 là con trỏ ps1.tu = 1; ps1.mau = 2; ps2->tu = 1; ps2->mau = 2; (*ps2).tu = 1; (*ps2).mau = 2; NMLT - Con trỏ cơ bản 3 0 && VC VC BB BB Con trỏ cấu trúc  Gán hai cấu trúc struct PHANSO { int tu, mau; }; PHANSO ps1, *ps2; ps1.tu = 1; ps1.mau = 2; // ps1 = 1/2 ps2 = &ps1; ps2->tu = 3; ps2->mau = 4; // ps1 = 3/4 NMLT - Con trỏ cơ bản 3 1 && VC VC BB BB Bài tập lý thuyết  Bài 1: Cho đoạn chương trình sau: float pay; float *ptr_pay; pay=2313.54; ptr_pay = &pay;  Hãy cho biết giá trị của: a. pay b. *ptr_pay c. *pay d. &pay Tin học cơ sở 2 - Đặng Bình Phương 3 2 && VC VC BB BB Bài tập lý thuyết  Bài 2: Tìm lỗi #include #include void main() { int *x, y = 2; *x = y; *x += y++; printf("%d %d",*x,y); getch(); } Tin học cơ sở 2 - Đặng Bình Phương 3 3 && VC VC BB BB Bài tập lý thuyết  Bài 1: Toán tử nào dùng để xác định địa chỉ của một biến?  Bài 2: Toán tử nào dùng để xác định giá trị của biến do con trỏ trỏ đến?  Bài 3: Phép lấy giá trị gián tiếp là gì?  Bài 4: Các phần tử trong mảng được sắp xếp trong bộ nhớ như thế nào?  Bài 5: Cho mảng một chiều data. Trình bày 2 cách lấy địa chỉ phần tử đầu tiên của mảng này. Tin học cơ sở 2 - Đặng Bình Phương 3 4 && VC VC BB BB Bài tập lý thuyết  Bài 6: Nếu ta truyền cho hàm đối số là mảng một chiều. Trình bày hai cách nhận biết phần tử cuối của mảng?  Bài 7: Trình bày 6 phép toán có thể thực hiện trên con trỏ?  Bài 8: Cho con trỏ p1 trỏ đến phần tử thứ 3 còn con trỏ p2 trỏ đến phần tử thứ 4 của mảng int. p2 – p1 = ?  Bài 9: Giống như câu trên nhưng đối với mảng float? Tin học cơ sở 2 - Đặng Bình Phương 3 5 && VC VC BB BB Bài tập  Bài 10: Trình bày khai báo con trỏ pchar trỏ đến kiểu char.  Bài 11: Cho biến cost kiểu int. Khai báo và khởi tạo con trỏ pcost trỏ đến biến này.  Bài 12: Gán giá trị 100 cho biến cost sử dụng hai cách trực tiếp và gián tiếp.  Bài 13: In giá trị của con trỏ và giá trị của biến mà nó trỏ tới.  Bài 14: Sử dụng con trỏ để làm lại các bài tập về mảng một chiều. Tin học cơ sở 2 - Đặng Bình Phương 3 6 && VC VC BB BB Bài tập lý thuyết  Bài 15: Cho đoạn chương trình sau: int *pint; float a; char c; double *pd; Hãy chọn phát biểu sai cú pháp: a. a = *pint; b. c = *pd; c. *pint = *pd; d. pd = a; Tin học cơ sở 2 - Đặng Bình Phương 3 7 && VC VC BB BB Bài tập thực hành  Bài 16: Viết chương trình nhập số nguyên dương n gồm k chữ số (0 < k ≤ 5) , sắp xếp các chữ số của n theo thứ tự tăng dần. Ví dụ:  Nhập n = 1536  Kết quả sau khi sắp xếp: 1356. Tin học cơ sở 2 - Đặng Bình Phương 3 8
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.