www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Nhập Môn Lập Trình
Mảng Hai Chiều – Con Trỏ
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Road Map
Mảng Đa Chiều
Khái Niệm Mảng Đa Chiều
Giải Thích Mảng 2 Chiều
Khai báo, duyệt, khởi tao, nhập/xuất mảng 2 chiều
Con Trỏ (Pointer)
Khái niệm về Con trỏ
Các toán tử
Con trỏ và mảng 1 chiều
Con trỏ và mảng 2 chiều
Con trỏ và chuỗi
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
và chỉ số cột.
GIẢI THÍCH MẢNG 2 CHIỀU
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
GIẢI THÍCH MẢNG 2 CHIỀU
float rain[5][12];
float rain[5][12]; /* array of 5 arrays of 12 floats */
float rain[5] [12]; /* rain: array of 5 somethings */
float rain[5] [12]; /* somethings = an array of 12 floats */
rain[0], the first element of rain, is an array of 12 float values.
So are rain[1], rain[2], rain[3], and rain[4].
If rain[0] is an array, its first element is rain[0][0], its second
element is rain[0][1], and so on.
Rain is a five-element array of 12-element arrays of float, rain[0] is
an array of 12 floats, and rain[0][0] is a float.
To access, say, the value in row 2, column 3, use rain[2][3].
(Remember, array counting starts at 0, so row 2 is the third row.)
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
GIẢI THÍCH MẢNG 2 CHIỀU
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
}
// Tổng phần tử mảng
S=0;
for (int i=0;i<row, i++)
{ for (int j=0;j<col;j++)
S+= m[i][j];
}
//Xuất mảng
for (int i=0;i<row, i++)
{ for (int j=0;j<col;j++) printf(“%3d”,m[i][j]);
printf(“\n”);
}
Duyệt mảng 2 chiều
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
9
#include <conio.h>
#include <stdio.h>
void main()
{ int mt1[2][3] = {1,2,3,4,5,6};
int mt2[2][3] = {{2,1,4},{4,7,6}};
int i,j; clrscr();
printf("mang 1\n");
for (i=0;i<2;i++)
{ for(j=0; j<3; j++) printf("%4d",mt1[i][j]);
printf("\n");
}
printf("mang 2\n");
Nhập/xuất mảng 2 chiều
Xuất mảng 2 chiều: sử dụng 2 vòng lặp for
Ví dụ xuất mảng số nguyên 2 chiều có N hàng và M cột
for (int i=0; i<N; i++)
{
for (j=0; j<M; j++)
{
printf(“%3d”,A[i][j]);
}
printf(“\n”);
}
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
www.hoasen.edu.vn
12
Viết chương trình nhập 1 mảng số nguyên 2 chiều với N hàng và
M cột. Thực hiện các công việc sau:
- In mảng 2 chiều ra màn hình
-
Tìm tổng các phần tử trong mảng.
- Liệt kê các phần tử chia hết cho 7.
- Tìm tổng các phần tử nằm trên đường viền của mảng
- Tìm cột có tích Max.
- Tìm dòng có nhiều số chính phương nhất
-
Hoán vị thành mảng MxN
-
Chuyển thành mảng 1 chiều rồi sắp xếp tăng dần
BÀI TẬP
Con trỏ được sử dụng trong chương trình để truy cập bộ nhớ
và vận dụng các bộ nhớ
Chúng ta đã sử dụng các địa chỉ bộ nhớ như là tham số cho
hàm scanf()
scanf(“%d”, &value): lưu 1 giá trị (được nhập) vào 1 địa chỉ cụ thể
trong bộ nhớ
value là biến và &value là địa chỉ
14
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Biến con trỏ
Khai báo: type *name;
type: một kiểu dữ liệu hợp lệ bất kỳ (int, long, char …)
name: tên của biến con trỏ
Ví dụ: int i, *p;
Gán giá trị:
p = &i; /* “referring” chỉ đến địa chỉ I */
p = 0;
P = NULL; /* tương đương với p = 0; */
15
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
?
7 7
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Addressing and Dereferencing
Bây giờ, chúng ta có thể dùng con trỏ p truy cập giá trị chứa trong
biến a
Điều này được thực hiện qua “dereference” của toán tử *
p là con trỏ, *p có giá trị của biến con trỏ “chỉ” đến
printf("*p = %d\n", *p); // 7 sẽ được in ra
( p points to a, and a has value 7, the dereferenced value of p is 7,
and that is what gets printed)
18
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Addressing and Dereferencing
*p = 3; → The object pointed to by p is assigned the value of 3
printf(“a = %d\n", a); /* 3 sẽ được in ra */
a b p
19
3 7
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Sử dụng con trỏ
Con trỏ và mảng 1 chiều
An array name by itself is an address or pointer value
Pointers and arrays are almost identical in term of how they are
used to assess memory
Differences:
A pointer is a variable that takes addresses as value
An array name is a particular fixed address that can be thought of as a
constant pointer
When an array is declared, the complier must allocate a base address and a
sufficient amount of storage to contain all elements of the array.
The base address of the array is the initial location in memory where the
array is stored
22
www.hoasen.edu.vn
Cùng Đại học Hoa Sen xây dựng tương lai
Con trỏ và mảng 1 chiều
int a[100], *p; → memory bytes numbered 300, 304, 308, …,
696 to be the addresses of a[0], a[1], a[2], …, a[99]
p = a; and p = &a[0]; → are equivalent and would assign 300 to p
a = p; ++a; a += 2; → Không cho phép (illegal)
23
www.hoasen.edu.vn
printf(“i=%d , array[i]=%d , *(array+i)= %d “, i, array[i], *(array+i));
printf(“&array[i] = %X , array + i = %X”, &array[i], array + i);
// %X gives unsigned hexadecimal
}
}
25