Khái Niệm Mảng Đa Chiều Giải Thích Mảng hai Chiều Khai báo, duyệt, khởi tao, nhập hoặc xuất mảng hai chiều, Con Trỏ ,Khái niệm về Con trỏ Các toán tử Con trỏ và mảng một chiều Con trỏ và mảng hai chiều Con trỏ và chuỗi là những kiến thức mà chúng tôi cung cấp cho bạn trong bài viết này,sẽ là tài liệu học tập tốt của các bạn
Trang 1Cù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ỏ
Trang 2Cùng Đại học Hoa Sen xây dựng tương lai
Trang 3Cùng Đại học Hoa Sen xây dựng tương lai
Khái Niệm Mảng Đa Chiều
- Mảng đa (nhiều) chiều là mảng mà những phần tử
của nó được xác định bởi nhiều chỉ số.
- Mảng 2 chiều là mảng nhiều chiều đơn giản và sử
dụng nhiều nhất.
- Mảng 2 chiều giống như một bảng, gồm nhiều dòng
và nhiều cột
Trang 4Cùng Đại học Hoa Sen xây dựng tương lai
m[2][3]
i và j là số nguyên
chỉ số dòng
Trang 5Cù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.)
Trang 6Cùng Đại học Hoa Sen xây dựng tương lai
GIẢI THÍCH MẢNG 2 CHIỀU
Trang 7Cùng Đại học Hoa Sen xây dựng tương lai
DataType mt [ maxRow ] [ maxColumn ] ;
int r, c ; // Số dòng và cột hiện thời
#define maxRow1 20
#define maxCol1 50
int m1 [maxRow1] [maxCol1];
int r1, c1;
const int maxRow2=30;
const int maxCol2=60;
Trang 8Cùng Đại học Hoa Sen xây dựng tương lai
for (int i=0;i<row; i++)
{ for (int j=0;j<col;j++) Xử lý m[i][j];
Những thao tác khác;
}
// 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
Trang 9Cùng Đại học Hoa Sen xây dựng tương lai
printf("\n");
} printf("mang 2\n");
for (i=0;i<2;i++) { for(j=0; j<3; j++) printf("%4d",mt2[i][j]);
printf("\n");
} getch();
}
Khởi tạo mảng
Khởi tạo mảng 2 chiều
Trang 10Cùng Đại học Hoa Sen xây dựng tương lai
printf(“A[%d][%d]:”,i,j);
scanf(“%d”,&A[i][j]);
}}
Trang 11Cùng Đại học Hoa Sen xây dựng tương lai
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”);
}
Trang 12Cùng Đại học Hoa Sen xây dựng tương lai
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
Trang 13Cùng Đại học Hoa Sen xây dựng tương lai
Trang 14Cùng Đại học Hoa Sen xây dựng tương lai
Khái niệm về Con trỏ
Con trỏ là một biến chứa địa chỉ vùng nhớ của một biến khác
Con trỏ được sử dụng trong chương trình để truy cập bộ nhớ
Trang 15Cù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ỏ
Trang 16Cùng Đại học Hoa Sen xây dựng tương lai
Các toán tử con trỏ
Hai toán tử đặc biệt được dùng với con trỏ: * và &
Toán tử &: trả về "địa chỉ của"
var2 = &var1; /* lấy địa chỉ vùng nhớ của biến var1 gán cho var2 */
/ *VD: var1 có giá trị 100 và dùng vùng nhớ 302 */
/* để lưu giá trị này Vậy var2 sẽ có giá trị 302 */
Toán tử *:
Dùng bổ xung với toán tử &
trả về giá trị chứa trong vùng nhớ mà vùng nhớ này được trỏ bởi giá trị của biến con trỏ (tại địa chỉ)
tmp = *var2; /* tmp có giá tri 100 */
16
Trang 17Cùng Đại học Hoa Sen xây dựng tương lai
Addressing and Dereferencing
int a, b, *p; → Complier to allocate space in memory for 2 int and
Trang 18Cù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
Trang 19Cù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 */
19
Trang 20Cùng Đại học Hoa Sen xây dựng tương lai
Sử dụng con trỏ
Để trả về nhiều hơn một giá trị từ một hàm
Thuận tiện hơn trong việc truyền các mảng và chuỗi từ một hàm
đến một hàm khác
Sử dụng con trỏ để làm việc với các phần tử của mảng thay vì truy xuất trực tiếp vào các phần tử này
Để cấp phát bộ nhớ động và truy xuất vào vùng nhớ được cấp phát
này (dynamic memory allocation)
20
Trang 21Cùng Đại học Hoa Sen xây dựng tương lai
Trang 22Cùng Đại học Hoa Sen xây dựng tương lai
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
Trang 23Cù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
Trang 24Cùng Đại học Hoa Sen xây dựng tương lai
Con trỏ và mảng 1 chiều
Truy cập địa chỉ các phần tử mảng:
array[100] ; // array mảng 1 chiều có 100 phần tử
địa chỉ của phần tử đầu tiên trong mảng: &array[0] hay array
địa chỉ của phần tử thứ hai trong mảng: &array[1] hay array + 1
Tổng quát, địa chỉ của phần tử thứ i trong mảng: &array[i+1] hay array + i
→ array[i] và *(array +i) đều biểu diễn nội dung của địa chỉ
đó, nghĩa là, giá trị của phần tử thứ i trong mảng array
24
Trang 25Cùng Đại học Hoa Sen xây dựng tương lai
Trang 26Cùng Đại học Hoa Sen xây dựng tương lai
Con trỏ và mảng 1 chiều
i=0 array[i]=1 *(array+i)=1 &array[i]=194 array+i = 194
i=1 array[i]=2 *(array+i)=2 &array[i]=196 array+i = 196
i=2 array[i]=3 *(array+i)=3 &array[i]=198 array+i = 198
i=3 array[i]=4 *(array+i)=4 &array[i]=19A array+i = 19A
i=4 array[i]=5 *(array+i)=5 &array[i]=19C array+i = 19C
i=5 array[i]=6 *(array+i)=6 &array[i]=19E array+i = 19E
i=6 array[i]=7 *(array+i)=7 &array[i]=1A0 array+i = 1A0
i=7 array[i]=8 *(array+i)=8 &array[i]=1A2 array+i = 1A2
i=8 array[i]=9 *(array+i)=9 &array[i]=1A4 array+i = 1A4
i=9 array[i]=10 *(array+i)=10 &array[i]=1A6 array+i = 1A6
Kết quả trình bày rõ ràng sự khác nhau giữa:
array[i] - biểu diễn giá trị của phần tử thứ i trong mảng
&array[i] - biểu diễn địa chỉ của nó.
26
Trang 27Cùng Đại học Hoa Sen xây dựng tương lai
Con trỏ và mảng 2 chiều
#define M 3 /* number of rows*/
#define N 4 /* number of columns */
…
int a[M][N], i, j;
Expressions equivalent to a[i][j]
*(a[i] + j) /* dấu ( ) cần thiết vì [ ] có độ ưu tiên > * */
(*(a + i))[j] /* a tương đương &a[0]: a pointer to an */
*(&a[0][0] + 5*i + j) /* base address &a[0][0] NOT a */
27
Trang 28Cùng Đại học Hoa Sen xây dựng tương lai
printf(" zippo = %p, zippo + 1 = %p\n", zippo, zippo + 1);
printf("zippo[0] = %p, zippo[0] + 1 = %p\n", zippo[0], zippo[0] + 1);
printf(" *zippo = %p, *zippo + 1 = %p\n", *zippo, *zippo + 1);
Trang 29Cùng Đại học Hoa Sen xây dựng tương lai
Trang 30Cùng Đại học Hoa Sen xây dựng tương lai
Con trỏ và chuỗi
char amessage[] = "now is the time"; → là mảng
char *pmessage = "now is the time"; → là con trỏ
amessage is an array:
just big enough to hold the sequence of characters and '\0' that initializes it
Individual characters within the array may be changed but
amessage will always refer to the same storage
pmessage is a pointer
initialized to point to a string constant;
the pointer may subsequently be modified to point elsewhere, but the result is undefined if you try to modify the string
contents
30
Trang 31Cùng Đại học Hoa Sen xây dựng tương lai
Xem 2 cách khai báo sau:
char hoten1[30]; /* Khai báo biến hoten1 là 1 xâu ký
tự có tối đa 30 ký tự */
char *hoten2; /* Khai báo biến con trỏ hoten2 kiểu char */
Nếu ta sử dụng các phép gán sau:
hoten1 = “Nguyen Van A”; không chấp nhậnkhông không chấp nhậnchấp không chấp nhậnnhận
hoten2 = “Nguyen Van B”; không chấp nhậnchấp không chấp nhậnnhận
Con Trỏ và Chuỗi
Trang 32Cùng Đại học Hoa Sen xây dựng tương lai
Trang 33Cùng Đại học Hoa Sen xây dựng tương lai
Bài tập điểm cộng tại nhà
1/ Viết chương trình nhập tên của 1 sinh viên, in ra tên là chữ viết hoa và cắt bỏ tất cả khoảng trắng (sử dụng con trỏ)
2/ Sử dụng con trỏ để viết chương trình thực hiện các công việc sau trên một mảng số nguyên: (mỗi công việc là 1 hàm)
Trang 34Cùng Đại học Hoa Sen xây dựng tương lai
Bài tập điểm cộng tại nhà
3/ Hãy chỉ các lỗi trong phần code sau:
#define SIZE 4int main(void){
int a[SIZE] = {0, 2, 2, 3, 4};
int b[SIZE - 5];
int c[3.0];
}
Trang 35Cùng Đại học Hoa Sen xây dựng tương lai
Bài tập điểm cộng tại nhà
4/ Bài tập sau nhằm đánh giá sự hiểu biết của bạn về con trỏ
#define SIZE 100 int main(void)
printf("%d\n", *(char *)((int *) p + 3));
printf("%d\n", *(char *)((int *) p + 3));
}Cái gì sẽ được in ra Hãy giải thích
Trang 36Cùng Đại học Hoa Sen xây dựng tương lai
Bài tập điểm cộng tại nhà
5/ Viết một chương trình đọc N số nguyên vào một mảng Sau đó
in từng dòng cho từng giá trị riêng biệt cùng với số lần của nó
có mặt trong mảng Các giá trị này nên được in theo thứ tự
giảm dần Ví dụ, bạn nhập vào các giá trị -7 3 3 -7 5 5 3 vào mảng Chương trình của bạn sẽ in ra:
5 Có mặt 2 lần
3 Có mặt 3 lần-7 Có mặt 2 lần