Kĩ thuật lập trình - Con trỏ (cơ bản)
Bạn đang xem tài liệu "Kĩ thuật lập trình - Con trỏ (cơ bản)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- ki_thuat_lap_trinh_con_tro_co_ban.pdf
Nội dung text: Kĩ thuật lập trình - Con trỏ (cơ bản)
- Trường Cao đẳng Kỹ thuật Công nghệ Đồng Nai Khoa Công nghệ thông tin NHẬP MÔN LẬP TRÌNH Phạm Đình Sắc dinhsac@gmail.com CON TRỎ (CƠ BẢN) 1 && VCVC Nội dung BBBB 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 2
- && VCVC Khai báo con trỏ BBBB 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 (2 bytes) còn p2 là biến kiểu int bình thường. NMLT - Con trỏ cơ bản 3 && VCVC Con trỏ NULL BBBB Khái niệm . Con trỏ NULL là con trỏ không trỏ vào đâu cả. . 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 NMLT - Con trỏ cơ bản 4
- && VCVC Khởi tạo kiểu con trỏ BBBB 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 5 && VCVC Sử dụng con trỏ BBBB 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 = &a; printf( %d\n , pa); // Giá tr bi n pa “ ” ị ế printf( %d\n , *pa); // Giá tr vùng nh pa tr n “ ” ị ớ ỏ đế printf( %d\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 0B 00 00 00 6 a pa NMLT - Con trỏ cơ bản
- && VCVC Kích thước của con trỏ BBBB 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 7 && VCVC Các cách truyền đối số BBBB 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 8
- && VCVC Các cách truyền đối số BBBB Truyền tham chiếu #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 9 && VCVC Các cách truyền đối số BBBB Truyền địa chỉ (con 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 10
- && VCVC Một số lưu ý BBBB 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 được. NMLT - Con trỏ cơ bản 11 && VCVC Con trỏ và mảng một chiều BBBB 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 12
- && VCVC Con trỏ và mảng một chiều BBBB 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 NMLT - Con trỏ cơ bản 13 && VCVC Phép toán số học trên con trỏ BBBB 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 14
- && VCVC Phép toán số học trên con trỏ BBBB 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 15 && VCVC Phép toán số học trên con trỏ BBBB 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 16
- && VCVC Con trỏ và mảng một chiều BBBB 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], *p; NMLT - Con trỏ cơ bản 17 && VCVC Con trỏ và mảng một chiều BBBB Ví dụ nhập - xuất mảng void nhap(int *a, int &n) { printf("\n nhap so phan tu: "); scanf("%d",&n); for (int i = 0; i<n; i++) { printf("a[%d] = ", i ); scanf("%d",&a[i]); } } void xuat(int *a, int n) { for (int i = 0; i<n; i++) printf( %d , a[i] ); “ ” } void main() { int n = 10, *a; nhap(a,n); xuat(a,n); 18 } NMLT - Con trỏ cơ bản
- && VCVC Con trỏ và mảng một chiều BBBB Ví dụ nhập - xuất mảng void nhap(int *a, int &n) { printf("\n nhap so phan tu: "); scanf("%d",&n); for (int i = 0; i #include void main() { char *strChao = "Chao ban"; char strTen[30]; puts("Cho biet ten cua ban: "); gets(strTen); puts(strChao); puts(strTen); getch(); } NMLT - Con trỏ cơ bản 20
- && VCVC Bài tập lý thuyết BBBB Bài 1: Cho đoạn chương trình sau: int a = 234; int *ptr_a; ptr_a = &a; Hãy cho biết giá trị của: a. a // printf("%d ", a); b. *ptr_a // printf("%d ", *ptr_a); c. &ptr_a // printf("%d ", &ptr_a); d. &a // printf("%d ", &a); e. *a // printf("%d ", *a); Tin học cơ sở 2 - Đặng Bình Phương 21 && VCVC Bài tập lý thuyết BBBB Bài 2: Kết quả ? #include #include void main() { int *x, y = 2; *x = y; *x += y; // (1) y++; // (2) *x += y++; printf("%d %d", *x, y); getch(); } Tin học cơ sở 2 - Đặng Bình Phương 22
- && VCVC Bài tập lý thuyết BBBB 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 23 && VCVC Bài tập lý thuyết BBBB 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 24
- && VCVC Bài tập BBBB 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 25 && VCVC Bài tập lý thuyết BBBB 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 26
- && VCVC Bài tập thực hành BBBB 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 27