Trong lập trình C, array (mảng) là một cấu trúc dữ liệu cơ bản cho phép bạn lưu trữ nhiều giá trị cùng kiểu trong một biến duy nhất. Mảng rất hữu ích khi bạn cần xử lý nhiều dữ liệu có cùng kiểu, chẳng hạn như danh sách các số nguyên, tên, hoặc dữ liệu từ cảm biến trong lập trình nhúng. Sử dụng array trong C giúp tối ưu hóa việc truy cập dữ liệu, đồng thời giảm bớt độ phức tạp của mã nguồn khi thao tác với nhiều biến.

1. Khái niệm Array trong C

Mảng trong C là một tập hợp các phần tử có cùng kiểu dữ liệu được lưu trữ trong bộ nhớ theo thứ tự liền kề. Các phần tử trong mảng có thể được truy cập thông qua chỉ số (index), bắt đầu từ 0. Điều này có nghĩa là phần tử đầu tiên trong mảng có chỉ số là 0, phần tử thứ hai là 1, và cứ tiếp tục như vậy.

2. Cách khai báo và khởi tạo Array trong C

Khai báo Array

Trong C, để khai báo một mảng, bạn cần xác định kiểu dữ liệu và số lượng phần tử của nó. Cú pháp khai báo mảng như sau:

data_type array_name[array_size];
  • data_type: Kiểu dữ liệu của các phần tử trong mảng (ví dụ: int, float, char).
  • array_name: Tên của mảng.
  • array_size: Kích thước của mảng (số lượng phần tử).

Ví dụ, khai báo một mảng int với 5 phần tử:

int numbers[5];

Khởi tạo Array

Bạn có thể khởi tạo mảng khi khai báo hoặc gán giá trị cho từng phần tử sau khi khai báo.

  • Khởi tạo khi khai báo:
int numbers[5] = {1, 2, 3, 4, 5};
  • Khởi tạo một phần tử cụ thể:
numbers[0] = 1;
numbers[1] = 2;
numbers[2] = 3;

Nếu bạn không cung cấp đủ giá trị cho tất cả phần tử, các phần tử còn lại sẽ được khởi tạo bằng 0:

int numbers[5] = {1, 2}; // [1, 2, 0, 0, 0]

3. Truy cập các phần tử trong Array

Để truy cập các phần tử trong mảng, bạn sử dụng cú pháp chỉ số với dấu ngoặc vuông []:

int value = numbers[0]; // Truy cập phần tử đầu tiên

Bạn có thể thay đổi giá trị của phần tử:

numbers[2] = 10; // Đặt phần tử thứ 3 bằng 10

4. Vòng lặp và Array

Mảng và vòng lặp thường được sử dụng cùng nhau để thao tác trên từng phần tử trong mảng. Đây là ví dụ sử dụng vòng lặp for để in ra tất cả phần tử trong mảng:

#include <stdio.h>

int main() {
    int numbers[5] = {1, 2, 3, 4, 5};

    for (int i = 0; i < 5; i++) {
        printf("%d ", numbers[i]);
    }

    return 0;
}

5. Các loại Array trong C

C hỗ trợ nhiều loại mảng, từ mảng một chiều đơn giản đến mảng nhiều chiều phức tạp.

1. Mảng một chiều

Mảng một chiều chỉ có một hàng các phần tử và được khai báo như đã giới thiệu ở trên.

2. Mảng hai chiều

Mảng hai chiều, hay ma trận, thường được sử dụng để lưu trữ dữ liệu dạng bảng. Bạn khai báo mảng hai chiều bằng cách chỉ định số hàng và số cột:

int matrix[3][3] = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

Để truy cập một phần tử trong mảng hai chiều, bạn cần chỉ định cả chỉ số hàng và chỉ số cột:

int value = matrix[1][2]; // Giá trị là 6

3. Mảng đa chiều

Mảng đa chiều có thể có nhiều hơn hai chiều. Mảng này ít phổ biến hơn trong thực tế nhưng hữu ích trong các ứng dụng đặc biệt, chẳng hạn lưu trữ dữ liệu 3D.

int array[2][3][4]; // Mảng 3 chiều

6. Con trỏ và Array

Trong C, tên của mảng thực chất là một con trỏ đến phần tử đầu tiên của mảng. Điều này có nghĩa là bạn có thể sử dụng con trỏ để thao tác với mảng.

Ví dụ, bạn có thể dùng con trỏ để truy cập các phần tử của mảng:

int numbers[5] = {1, 2, 3, 4, 5};
int *ptr = numbers;

for (int i = 0; i < 5; i++) {
    printf("%d ", *(ptr + i));
}

7. Ưu và Nhược điểm của Array trong C

Ưu điểm

  • Truy cập nhanh: Mảng cho phép truy cập trực tiếp đến từng phần tử thông qua chỉ số, giúp truy cập nhanh chóng.
  • Quản lý dữ liệu dễ dàng: Mảng giúp nhóm các giá trị có cùng kiểu dữ liệu trong một biến duy nhất, tiện lợi khi thao tác với dữ liệu.

Nhược điểm

  • Kích thước cố định: Khi khai báo, kích thước của mảng phải cố định và không thể thay đổi sau đó.
  • Lãng phí bộ nhớ: Nếu khai báo mảng lớn mà chỉ sử dụng một phần nhỏ, bộ nhớ sẽ bị lãng phí.

8. Các Kỹ thuật và Thủ thuật với Array trong C

Tìm phần tử lớn nhất/nhỏ nhất trong mảng

int findMax(int arr[], int size) {
    int max = arr[0];
    for (int i = 1; i < size; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
    }
    return max;
}

Sắp xếp mảng

Các thuật toán sắp xếp phổ biến như Bubble Sort, Selection Sort, hoặc Quick Sort thường được áp dụng để sắp xếp các phần tử trong mảng.

void bubbleSort(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

Đảo ngược mảng

void reverseArray(int arr[], int size) {
    for (int i = 0; i < size / 2; i++) {
        int temp = arr[i];
        arr[i] = arr[size - i - 1];
        arr[size - i - 1] = temp;
    }
}

9. Kết luận

Mảng là một trong những cấu trúc dữ liệu cơ bản và quan trọng nhất trong ngôn ngữ lập trình C. Hiểu rõ cách khai báo, khởi tạo, và thao tác với mảng giúp bạn tối ưu hóa mã và quản lý dữ liệu hiệu quả. Mặc dù mảng có nhược điểm, đặc biệt là kích thước cố định, nhưng với các kỹ thuật như sử dụng con trỏ hoặc các thuật toán sắp xếp, tìm kiếm, bạn có thể khai thác tối đa sức mạnh của mảng trong lập trình C.