Mảng (Array) trong C/C++

Mảng là một loại cấu tạo dữ liệu trong ngôn từ lập trình ₵/₵++, nó lưu trữ một tập hợp tuần tự các phần tử cùng kiểu với độ dài cố định. Mảng hay được dùng để lưu trữ tập hợp dữ liệu, nhưng nó cũng hữu ích khi dùng để lưu trữ một tập hợp biến có cùng kiểu.

Thay vì khai báo biến một cách rời rạc, như biến bien1, bien1,… & bien99, bạn có thể khai báo một mảng các giá trị như bien[0], bien[1] & … bien[99] để trình diễn các giá trị biệt lập. Một phần tử rõ ràng của mảng có thể được truy cập qua index (chỉ số).

Toàn bộ mảng đều bao gồm các địa điểm nhớ liền kề nhau. Địa chỉ thấp nhất tương ứng với phần tử trước hết & địa chỉ cao nhất tương ứng với thành phần cuối cùng của mảng.

Khai báo mảng trong ₵/₵++

Để khai báo một mảng trong ngôn từ ₵/₵++, bạn xác nhận kiểu của phần tử & số lượng các phần tử được yêu cầu bởi biến đó như sau:

Kieu Ten_mang [ Kich_co_mang ];

Đây là mảng 1 chiều. Kich_co_mang phải là một số nguyên to hơn 0 & Kieu phải hợp lệ trong ngôn từ ₵/₵++. Chẳng hạn, khai báo mảng balance với 10 phần tử có kiểu double, sử dụng câu lệnh sau đây:

char balance[10];

Khởi tạo mảng trong ₵/₵++

Bạn có thể khởi tạo mảng trong ₵/₵++ hoặc từng phần tử một hoặc sử dụng một câu lệnh như dưới đây:

int balance[5] = {15, 20, 25, 30, 35};

Số lượng các giá trị trong dấu ngoặc kép {} không được to hơn số lượng phần tử khai báo trong dấu ngoặc vuông [].

Nếu bạn không khai báo kích thước mảng thì mảng vừa đủ lớn để giữ các giá trị được khởi tạo. Chính vì như vậy nếu viết như dưới đây bạn vẫn sẽ thu được mảng giống hệt bên trên:

int balance[] = {15, 20, 25, 30, 35};

Bạn có thể tạo nên cùng một mảng giống như đã làm trong chẳng hạn trước.

balance[4] = 35;

Câu lệnh bên trên gán phần tử thứ 5 của mảng có giá trị 35. Toàn bộ các mảng đều có chỉ số (index) trước hết bằng 0, đây được gọi là chỉ số căn bản & phần tử cuối cùng của mảng có chỉ số bằng độ lớn của mảng trừ đi 1. Dưới đây là cách trình diễn hình họa cho chuỗi khai báo bên trên thông qua chỉ số:

01234balance1520253035

Truy cập các phần tử mảng trong ₵/₵++

Một mảng được truy cập bởi cách đánh chỉ số trong tên của mảng. Dưới đây là một cách truy cập một giá trị của mảng:

int hocphi = hocphik60[55];

Câu lệnh trên lấy phần tử thứ 56 của mảng & gán giá trị này cho biến hocphi. Dưới đây là một chẳng hạn về việc sử dụng với toàn bộ miêu tả bên trên:

#include <iostreamvàgt; 
using namespace std; 
#include <iomanipvàgt; 
using std::setw; 
int main () 
{ 
   int и[10]; 
   //и la mot đưa gom 10 so nguyen 
   //khoi tao gia tri cac phan tu cua đưa и la 0 
   for (int ι = 0; ι < 10; ι++) 
   { 
      и[i] = ι + 100; 
      //thiet lap phan tu tai vi tri ι la ι + 100 
   } 
   cout << "Phan tu thu:" << setw(13) << "Gia tri la:" << endl; 
   //hien thi gia tri cua moi phan tu 
   for (int j = 0; j < 10; j++) 
   { 
      cout << setw(7)<< j << setw(13) << и[j] << endl; 
   } return 0; }

Chương trình này sử dụng hàm setw(so_nguyen) trong ₵/₵++ để định dạng output. Tại đây, tham số so_nguyen là một số chỉ độ rộng của kết quả mà bạn mong muốn hiển thị. Ví dụ, với so_nguyen là 3 tức là bạn dành 3 địa điểm để in kết quả, nếu kết quả cần hiển thị là thừa thì nó sẽ bị cắt bớt, nếu thiếu thì chèn thêm khoảng không vào. Hàm setw() được dùng cho cả cout & cin.

Xem Thêm  Mảng trong C: Tổng quan, Cách khai báo và Khởi tạo chúng - mảng trong c là gì

Chạy chương trình ₵/₵++ trên sẽ cho kết quả như hình sau:

Cụ thể về mảng trong ₵/₵++

Mảng là một phần rất trọng yếu trong ngôn từ ₵/₵++. Dưới đây là những khái niệm trọng yếu liên quan đến một mảng rõ ràng mà được trình bày cụ thể hơn cho các lập trình viên ₵/₵++:

Khái niệmMiêu tả

Mảng đa chiều trong ₵/₵++

₵/₵++ bổ trợ các mảng đa chiều. Mẫu dễ dàng nhất của mảng đó là mảng hai chiều

Con trỏ tới một mảng trong ₵/₵++

Bạn có thể trỏ tới phần tử trước hết của mảng một cách dễ dàng chỉ bởi xác nhận tên mảng đó, chứ không phải một chỉ số

Truyền mảng tới hàm như là tham số trong ₵/₵++

Bạn có thể truyền tới hàm 1 điểm trỏ chỉ tới một mảng bởi xác nhận tên mảng chứ không phải là một chỉ số

Trả về mảng từ hàm trong ₵/₵++

₵/₵++ cho phép một hàm có thể trả về một mảng

Mảng đa chiều trong ₵++

₵++ bổ trợ các mảng đa chiều. Dưới đây là mẫu chung của một khai báo mảng đa chiều:

kieu_du_lieu ten_mang[kich_co_1][kich_co_2]...[kich_co_N];

Chẳng hạn, khai báo sau tạo một mảng số nguyên 3 chiều: 5. 10. 4:

int hocphi[5][10][4];

Mảng hai chiều trong ₵++

Mẫu dễ dàng nhất của mảng đa chiều là mảng hai chiều. Một mảng hai chiều về bản chất là mục lục của các mảng 1 chiều. Để khai báo một mảng hai chiều integer với kích thước Ҳ, y, chúng ta nên viết như sau:

kieu_du_lieu ten_mang [ x ][ y ];

Ở giai đoạn này, kieu_du_lieu có thể là bất kỳ kiểu dữ liệu có hiệu lực nào & ten_mang sẽ là một định danh ₵++ có hiệu lực.

Một mảng hai chiều có thể như là một bảng mà có Ҳ hàng & y cột. Một mảng hai chiều α chứa 3 hàng & 4 cột có thể được hiển thị như sau:

Như thế, mỗi phần tử trong mảng α được định danh bởi một tên phần tử trong kiểu mẫu α[i][j], với α là tên mảng & ι, j là các subscript – chỉ số được xác nhận duy nhất mỗi phần tử trong α.

Khởi tạo mảng hai chiều trong ₵++

Xem Thêm  Cách căn giữa văn bản trong hàng bảng HTML - nội dung trung tâm bảng html

Các mảng đa chiều có thể được khởi tạo bởi xác nhận các giá trị trong dấu móc vuông cho mỗi hàng. Sau đây là một hàng với 3 hàng & mỗi hàng chứa 4 cột.

int α[3][4] = {
 {0, 1, 2, 3} , /* khoi tao gia tri cho hang ma co chi muc la 0 */
 {4, 5, 6, 7} , /* khoi tao gia tri cho hang ma co chi muc la 1 */
 {8, 9, 10, 11} /* khoi tao gia tri cho hang ma co chi muc la 2 */
};

Các dấu ngoặc ôm, mà chỉ các hàng giá trị là tùy ý. Khởi tạo sau là tương tự với chẳng hạn trên:

int α[3][4] = {0,1,2,3,4,5,6,7,8,9,10,11};

Truy cập các phần tử của mảng hai chiều trong ₵++

Các phần tử mảng hai chiều được truy cập bởi sử dụng các chỉ số, chẳng hạn chỉ số hàng & chỉ số cột. Chẳng hạn:

int val = α[2][3];

Lệnh trên sẽ truy cập vào phần tử thứ 4 từ hàng thứ 3 của mảng. Bạn có thể kiểm soát lại nó trong sơ đồ trên. Lúc này tất cả chúng ta suy xét chẳng hạn dưới đây, http://phptravels.vn/ đã sử dụng các vòng lặp lồng vào nhau để giải quyết một mảng hai chiều:

include <iostreamvàgt;
using namespace std;
int main ()
{
  //đeo phía sau co 5 hang va 2 cot.
  int α[5][2] = {{0,0}, {1,2}, {2,4}, {3,6},{4,8}};
  //hien thi gia tri cua cac phan tu trong đưa
  for (int ι = 0; ι < 5; ι++)
  for (int j = 0; j < 2; j++)
  {
  cout << "Gia tri cua α[" << i << "][" << j << "] la: ";
  cout << α[i][j]<< endl;
  }
return 0;
}

Chạy chương trình ₵++ trên sẽ cho kết quả như hình sau:

Như phần trên đã giải thích, bạn có thể có các mảng với số chiều bất kỳ, nhưng đa số các mảng bạn tạo nên sẽ là một hoặc hai chiều.

Con trỏ tới một mảng trong ₵++

Có thể bạn sẽ không hiểu chương này tới khi bạn đã tham khảo chương về Con trỏ trong ₵++.

Chính vì như vậy giả sử rằng bạn đã hiểu biết chút nào đó về con trỏ trong ₵++, vậy tất cả chúng ta cùng khởi đầu: Một tên mảng là một con trỏ hằng số tới phần tử trước hết của mảng. Chính vì như vậy, trong khai báo:

double phithuebao[50];

phithuebao là một con trỏ tới &phithuebao[0], mà là địa chỉ của phần tử trước hết của mảng phithuebao. Thành ra, đoạn chương trình sau gán ρ địa chỉ của phần tử trước hết của phithuebao:

double *ρ; 
double phithuebao[10]; 
ρ = phithuebao;

Sử dụng các tên mảng như là các con trỏ hằng số là hợp lệ, & trái lại. Chính vì như vậy, *(phithuebao + 4) là cách chính thống để truy cập dữ liệu tại phithuebao[4].

Một khi bạn lưu địa chỉ của phần tử trước hết trong ρ, bạn có thể truy cập các phần tử mảng bởi sử dụng *ρ, *(ρ+1), *(ρ+2), … Dưới đây là chẳng hạn để chỉ toàn bộ các định nghĩa được đề cập ở trên:

#include <iostreamvàgt; 
using namespace std; 
int main () 
{ 
    //đeo phía sau co 5 phan tu. 
    double phithuebao[5] = {1000.0, 2.0, 3.4, 17.0, 50.0}; 
    double *ρ; 
    ρ = phithuebao; 
    // hien thi gia tri cac phan tu trong đưa 
    cout << "Hien thi gia tri mang boi su dung con tro!" << endl; 
    for (int ι = 0; ι < 5; ι++) 
    { 
        cout << "Gia tri cua *(p + " << ι << ") la: "; 
        cout << *(ρ + ι) << endl; 
    } 
    cout << "Hien thi gia tri mang boi su dung phithuebao lam dia chi!" << endl; 
    for (int ι = 0; ι < 5; ι++) 
    { 
        cout << "*Gia tri cua (phithuebao + " << ι << ") la: "; 
        cout << *(phithuebao + ι) << endl; 
    } 
return 0; 
}

Chạy chương trình ₵++ trên sẽ cho kết quả như hình sau:

Xem Thêm  Tham gia bằng Python: Định nghĩa, Cách sử dụng, Cú pháp và Tham số - tham gia làm gì trong python

Trong chẳng hạn trên, ρ là một con trỏ tới double, mà có nghĩa là nó có thể cất giữ địa chỉ của một biến kiểu double. Một khi tất cả chúng ta có địa chỉ trong ρ, thì sau đó *ρ sẽ phân phối giá trị có sẵn tại địa chỉ được lưu trong ρ, như http://phptravels.vn/ đã chỉ trong chẳng hạn trên.

Truyền mảng như là các tham số hàm trong ₵++

Trả về mảng từ hàm trong ₵++

₵++ không cho phép bạn trả về toàn thể một mảng như là một tham số tới một hàm. Bên cạnh đó, bạn có thể trả về một con trỏ tới một mảng bởi xác nhận tên mảng này mà không phải là một chỉ số. Bạn sẽ học về con trỏ trong chương tới, chính vì như vậy bạn có thể bỏ qua chương này tới khi bạn hiểu định nghĩa về Con trỏ trong ₵++.

Nếu bạn mong muốn trả về một mảng 1 chiều từ một hàm, bạn sẽ phải khai báo một hàm trả về một con trỏ như trong chẳng hạn sau:

int * tenHam() 
{ 
. 
. 
. 
}

Điểm thứ hai cần nhớ là ₵++ không ủng hộ việc trả về địa chỉ của biến cục bộ tới bên ngoài hàm, chính vì như vậy bạn sẽ phải khái niệm biến cục bộ như là biến Static.

Lúc này, giả sử hàm sau sẽ tạo 10 số bỗng dưng & trả chúng về bởi sử dụng một mảng & gọi hàm này như sau:

#include <iostreamvàgt; 
#include <ctimevàgt; 
#include <stdlib.hvàgt; /* thu vien cho ham srand, rand */ using namespace std; 
// phan dinh nghia cua ham de tao va tra ve cac so ngau nhien. 
int * soNgauNhien( ) 
{ 
   static int r[10]; 
   srand( (unsigned)time( NULL )); 
   for (int ι = 0; ι < 10; ++ι) 
   { 
     r[i] = rand(); 
     cout << r[i] << endl; 
   } 
   return r; 
} 
// ham main de goi phan dinh nghia ham tren. 
int main () 
{ 
   // mot con tro tro toi mot so nguyen. 
   int *ρ; 
   ρ = soNgauNhien(); 
   for (int ι = 0; ι < 10; ι++) 
   { 
      cout << "Gia tri cua *(p + " << ι << ") la: "; 
      cout << *(ρ + ι) << endl; 
   } 
return 0; 
}

Chạy chương trình ₵++ trên sẽ cho kết quả như hình sau:

Theo Tutorialspoint

Bài trước: Number trong ₵++

Bài tiếp: Chuỗi (String) trong ₵/₵++

balance[4] = 30;

Viết một bình luận