1 1 TIN HỌC ĐẠI CƯƠNG TIN HỌC ĐẠI CƯƠNG PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C BÀI 4: BÀI 4: CON TRỎ VÀ MẢNG CON TRỎ VÀ MẢNG KHOA KHOA C¤NG NGHÖ C¤NG NGHÖ TH¤NG TIN TH¤NG TIN FACULTY OF FACULTY OF INFORMATION TECHNOLOGY INFORMATION TECHNOLOGY 2 2 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT BÀI 4: BÀI 4: CON TRỎ VÀ MẢNG CON TRỎ VÀ MẢNG 4 4 .1. .1. Con trỏ và địa chỉ Con trỏ và địa chỉ 4.1.1. Tổng quan về con trỏ 4.1.1. Tổng quan về con trỏ 4.1.2. Các phép toán làm việc với con 4.1.2. Các phép toán làm việc với con trỏ trỏ 4.2. Mảng 4.2. Mảng 4.2.1. Khái niệm mảng 4.2.1. Khái niệm mảng 4.2.2. Khai báo và sử dụng mảng 4.2.2. Khai báo và sử dụng mảng 4.2.3. Các thao tác cơ bản làm việc 4.2.3. Các thao tác cơ bản làm việc trên mảng trên mảng 4.3. Sử dụng con trỏ làm việc với mảng 4.3. Sử dụng con trỏ làm việc với mảng 3 3 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.1.1. 4.1.1. Tổng quan về con trỏ Tổng quan về con trỏ a. Địa chỉ và giá trị của một biến a. Địa chỉ và giá trị của một biến Bộ nhớ như một dãy các byte nhớ. Bộ nhớ như một dãy các byte nhớ. Các byte nhớ được xác định một cách duy Các byte nhớ được xác định một cách duy nhất qua một nhất qua một địa chỉ địa chỉ . . Biến được lưu trong bộ nhớ. Biến được lưu trong bộ nhớ. Khi khai báo một biến Khi khai báo một biến Chương trình dịch sẽ cấp phát cho biến đó một số ô nhớ liên Chương trình dịch sẽ cấp phát cho biến đó một số ô nhớ liên tiếp đủ để chứa nội dung của biến. Ví dụ một biến số nguyên tiếp đủ để chứa nội dung của biến. Ví dụ một biến số nguyên (int) được cấp phát 2 byte. (int) được cấp phát 2 byte. Địa chỉ của một biến chính là địa chỉ của byte đầu tiên trong Địa chỉ của một biến chính là địa chỉ của byte đầu tiên trong số đó. số đó. 4 4 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.1.1. 4.1.1. Tổng quan về con trỏ Tổng quan về con trỏ a. Địa chỉ và giá trị của một biến a. Địa chỉ và giá trị của một biến (tiếp) (tiếp) Một biến luôn có hai đặc tính: Một biến luôn có hai đặc tính: Địa chỉ của biến. Địa chỉ của biến. Giá trị của biến. Giá trị của biến. Ví dụ: Ví dụ: int i, j; int i, j; i = 3; i = 3; j = i + 1; j = i + 1; Biến Địa chỉ Giá trị i FFEC 3 j FFEE 4 5 5 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.1.1. 4.1.1. Tổng quan về con trỏ Tổng quan về con trỏ b. Khái niệm và khai báo con trỏ b. Khái niệm và khai báo con trỏ Con trỏ là một biến mà giá trị của nó là Con trỏ là một biến mà giá trị của nó là địa chỉ của một vùng nhớ. địa chỉ của một vùng nhớ. Khai báo con trỏ: Khai báo con trỏ: Cú pháp khai báo một con trỏ như sau: Cú pháp khai báo một con trỏ như sau: Kieu_du_lieu *ten_bien_con_tro; Kieu_du_lieu *ten_bien_con_tro; Ví dụ Ví dụ int i = 3; int i = 3; int *p; int *p; p = &i; p = &i; Một con trỏ chỉ có thể trỏ tới một đối Một con trỏ chỉ có thể trỏ tới một đối tượng cùng kiểu. tượng cùng kiểu. Biến Địa chỉ Giá trị i FFEC 3 p FFEE FFEC 6 6 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.1.1. 4.1.1. Tổng quan về con trỏ Tổng quan về con trỏ Toán tử Toán tử & & và và * * Toán tử Toán tử & & : Trả về địa chỉ của biến. : Trả về địa chỉ của biến. Toán tử Toán tử * * : Trả về giá trị chứa trong vùng : Trả về giá trị chứa trong vùng nhớ được trỏ bởi giá trị của biến con trỏ. nhớ được trỏ bởi giá trị của biến con trỏ. Cả hai toán tử * và & có độ ưu tiên cao Cả hai toán tử * và & có độ ưu tiên cao hơn tất cả các toán tử số học ngoại trừ hơn tất cả các toán tử số học ngoại trừ toán tử đảo dấu. toán tử đảo dấu. Ví dụ: Ví dụ: void main() void main() { { int i = 3; int *p; int i = 3; int *p; p = &i; p = &i; printf("*p = %d \n",*p); printf("*p = %d \n",*p); getch(); getch(); } } 7 7 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.1.1. 4.1.1. Tổng quan về con trỏ Tổng quan về con trỏ c. Sử dụng biến con trỏ: c. Sử dụng biến con trỏ: Một biến con trỏ có thể được gán bởi: Một biến con trỏ có thể được gán bởi: Địa chỉ của một biến khác: Địa chỉ của một biến khác: ten_bien_con_tro = &ten_bien; ten_bien_con_tro = &ten_bien; Giá trị của một con trỏ khác (tốt nhất là cùng kiểu): Giá trị của một con trỏ khác (tốt nhất là cùng kiểu): ten_bien_con_tro2 = ten_bien_con_tro1; ten_bien_con_tro2 = ten_bien_con_tro1; Giá trị NULL (số 0): Giá trị NULL (số 0): ten_bien_con_tro = 0; ten_bien_con_tro = 0; Gán giá trị cho biến con trỏ: Gán giá trị cho biến con trỏ: *ten_bien_con_tro = 10; *ten_bien_con_tro = 10; 8 8 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.1.1. 4.1.1. Tổng quan về con trỏ Tổng quan về con trỏ Ví dụ 1: Ví dụ 1: main() main() { { int i = 3, j = 6; int i = 3, j = 6; int *p1, *p2; int *p1, *p2; p1 = &i; p1 = &i; p2 = &j; p2 = &j; *p1 = *p2; *p1 = *p2; } } 9 9 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.1.1. 4.1.1. Tổng quan về con trỏ Tổng quan về con trỏ Ví dụ 2: Ví dụ 2: main() main() { { int i = 3, j = 6; int i = 3, j = 6; int *p1, *p2; int *p1, *p2; p1 = &i; p1 = &i; p2 = &j; p2 = &j; p1 = p2; p1 = p2; } } 10 10 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.1.1. 4.1.1. Tổng quan về con trỏ Tổng quan về con trỏ d. Con trỏ void d. Con trỏ void void *ten_bien_con_tro; void *ten_bien_con_tro; Con trỏ đặc biệt, không có kiểu, Con trỏ đặc biệt, không có kiểu, Có thể nhận giá trị là địa chỉ của một Có thể nhận giá trị là địa chỉ của một biến thuộc bất kỳ kiểu dữ liệu nào. biến thuộc bất kỳ kiểu dữ liệu nào. Ví dụ: Ví dụ: void *p, *q; void *p, *q; int x = 21; int x = 21; float y = 34.34; float y = 34.34; p = &x; q = &y; p = &x; q = &y; [...]... Trang, SE-FIT-HUT c[0] -4 5 c[1] 6 c[2] 0 c[3] 72 c[4] 1543 c[5] -8 9 c[6] 0 c[7] 62 c[8] -3 c[9] 1 c[10] 6453 c[11] 78 13 4.2.2 Khai báo và sử dụng mảng a Khai báo: Cú pháp: Kieu_du_lieu ten_mang[kich_thuoc_mang]; Ví dụ: char c[12]; Phần tử đầu tiên có chỉ số 0 n phần tử của mảng có tên c: int mang_nguyen[4]; float mang_thuc[6]; -4 5 c[1] 6 c[2] 0 c[3] 72 c[4] 1543 c[5] -8 9 c[6] 0 c[7] 62 c[8] -3 c[9]... Trang, SE-FIT-HUT 23 Kết quả: ©Nguyễn Thị Thu Trang, SE-FIT-HUT 24 c Tính tổng giá trị các phần tử #include #define SIZE 12 void main() { int a[SIZE] = {1, 3, 5, 4, 7, 2, 99, 16, 45, 67, 89, 45}; int i; int total = 0; for ( i = 0; i < SIZE; i++ ) { total += a[ i ]; } /* end for */ printf( "Tong gia tri cac phan tu trong mang la: %d\n", total ); getch(); } ©Nguyễn Thị Thu Trang, SE-FIT-HUT 25... (float)(tong/SO_SV)); getch(); } ©Nguyễn Thị Thu Trang, SE-FIT-HUT 28 4.2.3 Các thao tác cơ bản làm việc trên mảng (4) Tìm phần tử lớn nhất, nhỏ nhất Tìm kiếm trên mảng Sắp xếp mảng ©Nguyễn Thị Thu Trang, SE-FIT-HUT 29 a Tìm các phần tử có giá trị lớn nhất, nhỏ nhất #define KT 100 int a[KT]; max = a[0]; Dùng vòng lặp for phần tử có chỉ số của mảng a so từ sánh max 1, 2, …, với n-1 Nếu max < phần tử i thì gán max =... ©Nguyễn Thị Thu Trang, SE-FIT-HUT 16 4.2.2 Khai báo và sử dụng mảng (2) b Sử dụng mảng (tiếp): Ví dụ 2: int a[6][5]; a[0] là phần tử đầu tiên của mảng, là 1 mảng Phần tử đầu tiên của mảng a[0] là a[0][0],… … a[2][3] sẽ là phần tử thứ 4 của phần tử thứ 3 của a a[i][j] sẽ là phần tử thứ j+1 của a[i], mà phần tử a[i] lại là phần tử thứ i+1 của a ©Nguyễn Thị Thu Trang, SE-FIT-HUT 17 4.2.3 Các thao... Thu Trang, SE-FIT-HUT 19 4.2.3 Các thao tác cơ bản làm việc trên mảng (3) a Nhập dữ liệu cho mảng (tiếp): Mảng có thể được khởi tạo giá trị ngay khi khai báo int a[4] = {4, 9, 22, 16}; float b[3] = {40.5, 20.1, 100}; char c[5] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’}; Câu lệnh thứ nhất có tác dụng tương đương với 4 lệnh gán: a[0] = 4; a[1] = 9; a[2] = 22; a[3] = 16; ©Nguyễn Thị Thu Trang, SE-FIT-HUT 20 b Xuất... ©Nguyễn Thị Thu Trang, SE-FIT-HUT 21 b Xuất dữ liệu chứa trong mảng (2) //Hien thi gia tri tat ca cac phan tu //Moi phan tu tren 1 dong for(i = 0; i < KT; i++) printf(“\n%d”, a[i]); printf(“\n”); // Xuong dong moi /* Hien thi gia tri cua tat ca cac phan tu mang a tren 1 dong, cac phan tu cach nhau 1 dau tab */ for(i = 0; i < KT; i++) printf(“%d\t“, a[i]); ©Nguyễn Thị Thu Trang, SE-FIT-HUT 22 b Xuất dữ liệu... x, *p1, *p2; &x; p1+1; ©Nguyễn Thị Thu Trang, SE-FIT-HUT 11 BÀI 4: CON TRỎ VÀ MẢNG 4.1 Con trỏ và địa chỉ 4.1.1 Tổng quan về con trỏ 4.1.2 Các phép toán làm việc với con trỏ 4.2 Mảng 4.2.1 Khái niệm mảng 4.2.2 Khai báo và sử dụng mảng 4.2.3 Các thao tác cơ bản làm việc trên mảng 4.3 Sử dụng con trỏ làm việc với mảng ©Nguyễn Thị Thu Trang, SE-FIT-HUT 12 4.2.1 Khái niệm mảng Mảng là một tập hợp... c[9] c[ 0 ], c[ 1 ] c[ n – 1 ] c[0] 1 c[10] c[11] ©Nguyễn Thị Thu Trang, SE-FIT-HUT 6453 78 14 4.2.2 Khai báo và sử dụng mảng a Khai báo (tiếp): Mảng nhiều chiều: Mỗi phần tử của mảng cũng là một mảng khác Giống vector trong toán học Ví dụ: Mảng 2 chiều: int a[6][5]; Mảng 3 chiều: int b[3][4][5]; ©Nguyễn Thị Thu Trang, SE-FIT-HUT 15 4.2.2 Khai báo và sử dụng mảng b Sử dụng mảng: Truy cập vào... mang la: %d",max); getch(); } ©Nguyễn Thị Thu Trang, SE-FIT-HUT 31 b Tìm kiếm trên mảng Bài 1: Nhập vào các phần tử của mảng thực có số lượng các phần tử tối đa là 100 Nhập 1 số thực giá trị bất kỳ và tìm trên mảng đó có bao nhiêu phần tử có giá trị bằng số thực vừa nhập? Nếu có, hãy đưa ra chỉ số của các phần tử đó ©Nguyễn Thị Thu Trang, SE-FIT-HUT 32 b Tìm kiếm trên mảng (2) Cách làm: Đếm các... Thu Trang, SE-FIT-HUT 34 dem = 0; //Bat dau tim kiem for(i = 0;i < n;i++) if(m[i] == kiem_tra) { chi_so[dem] = i; dem ++; } if (dem > 0) { printf(“\n Trong mang co %d phan tu = %.2f”, dem, kiem_tra); printf(“\n Chi so cua cac phan tu la: “); for(i = 0; i < dem; i++) printf(“%3d”, chi_so[i]); } else printf(“\n Khong co phan tu nao = %.2f”, kiem_tra); getch(); } ©Nguyễn Thị Thu Trang, SE-FIT-HUT 35 b Tìm . mảng . . c[6] -4 5 6 0 72 1543 -8 9 0 62 -3 1 6453 78 c[0] c[1] c[2] c[3] c[11] c[10] c[9] c[8] c[7] c[5] c[4] 14 14 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.2.2. Khai. mang_thuc[6]; c[6] -4 5 6 0 72 1543 -8 9 0 62 -3 1 6453 78 c[0] c[1] c[2] c[3] c[11] c[10] c[9] c[8] c[7] c[5] c[4] 15 15 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.2.2. Khai. chỉ của byte đầu tiên trong số đó. số đó. 4 4 Nguyễn Thị Thu Trang, SE-FIT-HUT Nguyễn Thị Thu Trang, SE-FIT-HUT 4.1.1. 4.1.1. Tổng quan về con trỏ Tổng quan về con trỏ a. Địa chỉ và