Chương trình C giống như một điệu nhảy nhanh trên sàn nhảy mới được bôi sáp của người mang theo dao cạo râu. Edward V Berard
STDIO Sau khi khai báo int a[5]; ta 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... Bài viết sẽ hướng dẫn các thao tác trên mảng một chiều.
Nội dung bài viết

Giới thiệu

Một số thao tác cơ bản trên mảng 1 chiều.

Tiền đề bài viết

Bài viết nằm trong chương trình học lập trình cơ bản với ngôn ngữ C++ của Stdio.

Đối tượng hướng đến

Bài viết dành cho những người mới bắt đầu làm quen với ngôn ngữ lập trình C++

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

Sau khi khai báo int a[5]; ta 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 ta có thể xác định được một 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 chay 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ế chúng ta 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, chúng ta 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++ :: www.stdio.vn/articles/read/29/pointer-trong-c.

Như vậy, để xuất một mảng ra màn hình, ta 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 ddiefu này ta 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ử ta có mảng int a[3] = {1, 2, 3}; và ta muốn tạo một mảng nữa, giống hệt mảng này. Đầu tiên, ta 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, a và b ở đâ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ì một khi đã được cấp phát thì địa chỉ của một biến không thể thay đổi được nữa.

Như vậy, để sao chép một mảng chúng ta 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, ta cũng làm tương tự như khi truyền một biến, nhưng phải kèm thêm một 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, một 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, chúng ta 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, ta 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, ta 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ớ. 

Bạn cần hỗ trợ các dự án kết nối không dây?

Quí doanh nghiệp, cá nhân cần hỗ trợ, hợp tác các dự án IoT, kết nối không dây. Vui lòng liên hệ, hoặc gọi trực tiếp 0942.111912.

  • TỪ KHÓA
  • Arduino
  • ESP32
  • ESP8266
  • Wifi
  • Bluetooth
  • Zigbee
  • Raspberry Pi
THẢO LUẬN
ĐÓNG