Search…

Thao Tác trên Mảng 1 Chiều

17/09/20204 min read
Hướng dẫn các thao tác trên mảng một chiều trong C/C++.

Truy xuất phần tử mảng

Sau khi khai báo int a[5]; có thể truy xuất đến các phần tử của a qua các chỉ số như a[0], a[1], a[2]...Tuy nhiên, không giống như khi khai báo, các chỉ số ở đây không nhất thiết phải là giá trị hằng số mà có thể là giá trị của biến, giá trị của hàm... miễn sao với giá trị này có thể xác định được 1 phần tử trong mảng.

Ví dụ

 #include <iostream>
using namespace std;

int add(int a, int b)
{
       return a + b;
}

int main()
{
       int a[3];
       int b = 1;
       a[0] = 0;
       a[b] = 1;
       a[add(b, b)] = 2;
}

Lưu ý

Việc truy xuất tới các phần tử không thuộc mảng – trong ví dụ này là a[3], a[4]... thường thì trình biên dịch và chương trình khi chạy sẽ không báo lỗi, nhưng việc này sẽ vô cùng nguy hiểm khi có dữ liệu quan trọng hoặc làm việc với con trỏ và gây ra các lỗi về vùng nhớ. Vì thế nên luyện tập thói quen quản lý tốt chỉ số khi thao tác trên mảng.

Xuất mảng ra màn hình

Đầu tiên thử sử dụng cout:    

#include <iostream>
using namespace std;

int main()
{
       int a[3] = {1, 2, 3};
       cout << a;
}

Kết quả nhận được không phải là dãy số 1 2 3 như mong đợi. Nếu chúng ta chỉ sử dụng a mà không kèm theo chỉ số, thì đây sẽ là địa chỉ  của mảng a. Vấn đề này được nói rõ hơn ở bài viết Pointer Trong C++.

Như vậy, để xuất 1 mảng ra màn hình, bắt buộc phải truy xuất đến từng phần tử của mảng và xuất ra màn hình lần lượt từng phần tử. Để làm điều này có thể sử dụng vòng lặp:

#include <iostream>
using namespace std;

int main()
{
       int a[3] = {1, 2, 3};

       for (int i = 0; i < 3; i++)
       {
              cout << a[i] << endl;
       }
}

Sao chép mảng

Giả sử có mảng int a[3] = {1, 2, 3}; và muốn tạo 1 mảng nữa, giống hệt mảng này. Đầu tiên, thử sử dụng toán tử =

#include <iostream>
using namespace std;

int main()
{
       int a[3] = { 1, 2, 3 };
       int b[3];

       b = a;  // Bao loi
}

Phép gán b = a sẽ báo lỗi, như đã nói ở trên, ab ở đây mang giá trị là địa chỉ của mảng a và mảng b, phép gán này làm thay đổi địa chỉ của mảng b nên phát sinh ra lỗi vì 1 khi đã được cấp phát thì địa chỉ của 1 biến không thể thay đổi được nữa.

Như vậy, để sao chép 1 mảng cũng phải sao chép từng phân tử của mảng tương tự như việc xuất mảng ra màn hình bằng cách sử dụng vòng lặp:

#include <iostream>
using namespace std;

int main()
{
       int a[3] = { 1, 2, 3 };
       int b[3];

       for (int i = 0; i < 3; i++)
       {
              b[i] = a[i];
       }
}

Truyền mảng vào hàm

Khi truyền mảng vào hàm, cũng làm tương tự như khi truyền 1 biến, nhưng nên kèm thêm 1 tham số chứa số phần tử của mảng để quản lý việc truy xuất các phần tử của mảng trong hàm.

#include <iostream>
using namespace std;

void printArray(int a[], int size)
{
       for (int i = 0; i < size; i++)
       {
              cout << a[i] << endl;
       }
}

int main()
{
       int a[3] = { 1, 2, 3 };
       printArray(a, 3);
}

Chèn và xóa các phần tử mảng

Thực chất, 1 khi mảng đã được khai báo, tức là vị trí và kích thước của nó trên vùng nhớ đã được xác định, không thể nào thay đổi được nữa. Vì thế việc chèn thêm và xóa bớt số lượng phần tử của mảng trên vùng nhớ là không thể làm được. Tuy nhiên, với thao tác xóa bớt số phần tử mảng, có thể chủ động giảm giá trị biến quản lý số lượng phần tử của mảng:

#include <iostream>
using namespace std;

int main()
{
       int a[3] = { 1, 2, 3 };
       int size = 3;

       for (int i = 0; i < size; i++)
       {
              cout << a[i] << endl;
       }

       size--;

       for (int i = 0; i < size; i++)
       {
              cout << a[i] << endl;
       }
}

Việc này thực ra không mang nhiều ý nghĩa, vì phần tử của mảng đơn giản là không được xuất ra hoặc đôi khi là mang giá trị khác đi nhưng nó vẫn nằm trên vùng nhớ đó, vẫn thuộc quyền quản lý của mảng.

Tương tự, để tăng số phần tử của mảng, tăng giá trị biến quản lý số lượng phần tử của mảng. Nhưng việc này còn nhiều nguy cơ hơn xóa phần tử của mảng vì có thể gây tác động đến dữ liệu khác hoặc gây các lỗi về vùng nhớ nên khi thao tác với mảng hạn chế thêm/bớt phần tử của mảng. Để làm việc linh động với mảng thì nên tìm hiểu về cấp phát động.

IO Stream

IO Stream Co., Ltd

30 Trinh Dinh Thao, Hoa Thanh ward, Tan Phu district, Ho Chi Minh city, Vietnam
+84 28 22 00 11 12
developer@iostream.co

383/1 Quang Trung, ward 10, Go Vap district, Ho Chi Minh city
Business license number: 0311563559 issued by the Department of Planning and Investment of Ho Chi Minh City on February 23, 2012

©IO Stream, 2013 - 2024