Mảng

Giới thiệu mảng

Mảng là một danh sách các phần tử liên tiếp nhau cùng kiểu dữ liệu. Mảng tĩnh có số lượng phần tử không thay đổi lúc biên dịch chương trình. Trong C các phần tử của mảng được đánh số từ 0.

Ví dụ khai báo mảng numbers kiểu int có 5 phần tử và khởi tạo các phần tử theo thứ tự:

1
2
3
int numbers1[5]; // khởi tạo mảng 5 phần tử và không gán giá trị
int numbers2[5] = {5, 4, 3, 2, 1}; // khởi tạo mảng numbers2 với 5 phần tử
int numbers3[] = {1, 2, 3, 4, 5}; // khởi tạo mảng numbers3 với 5 phần tử

Không thể đọc hay ghi cả một mảng, tuy nhiên ví dụ sau ta có thể đọc và ghi một phần tử trong mảng:

1
2
3
4
int numbers[] = {1, 2, 3, 4, 5};; // numbers là hằng (const) không thể thay đổi
int a;
numbers[0] = 20; // phần tử đầu tiên gán giá trị 20
a = numbers[3]; // gán giá trị phần tử thứ 4 vào biến a.

Truy cập phần tử ngoài mảng

Chúng ta có thể đọc và ghi phần tử ngoài mảng, trình biên dịch sẽ không báo lỗi. Tuy nhiên cũng có thể gây ra những lỗi khi thực thi chương trình.

Mảng nhiều chiều

Tương tự khai báo mảng một chiều, ví dụ sau khai báo mảng hai chiều kiểu int

1
2
3
4
5
6
7
int numbers[2][3] = {
  {1,2,3},
  {4,5,6}
};
printf("a[0][0] = %d", a[0][0]); // in 0
printf("a[0][2] = %d", a[0][2]); // in 3
printf("a[1][2] = %d", a[1][2]); // in 6

Mảng 2 chiều thực chất được lưu trong bộ nhớ như mảng một chiều

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
int arr[2][2] = {
  {1,2},
  {3,4}
};
// in địa chỉ phần tử đầu tiên
printf("%p\n", &arr[0][0]);

// in địa chỉ phần tử thứ hai (cách phần tử đầu tiên 4 byte)
printf("%p\n", &arr[0][1]);

// in địa chỉ phần tử thứ ba (cách phần tử thứ hai 4 byte)
printf("%p\n", &arr[1][0]);

// in địa chỉ phần tử thứ tư (cách phần tử thứ ba 4 byte)
printf("%p\n", &arr[1][1]);