STDIO
Tìm kiếm gần đây
    Nội dung
    0
    0
    Chia sẻ

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

    Hướng dẫn các thao tác trên mảng một chiều trong C/C++.
    Phi Phạm

    Phi Phạm

    26/04/2015
    17/09/2020
    4 phút đọc
    Thao Tác trên Mảng 1 Chiều

    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.

    0 Bình luận
    Modern C++

    Modern C++

    STDIO Training - Đào Tạo Lập Trình C++.

    Khi bạn nhấn vào sản phẩm do chúng tôi đề xuất và mua hàng, chúng tôi sẽ nhận được hoa hồng. Điều này hỗ trợ chúng tôi có thêm kinh phí tạo nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO

    Trang chính

    Công ty TNHH STDIO

    • 30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
      +84 28.36205514 - +84 942.111912
      developer@stdio.vn
    • 383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
      Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012
    ©STDIO, 2013 - 2021